ini 文件操作
[編輯] [转简体] (简体译文)
|
作者:huidong
| 分類:【編程】Win32
[
11 瀏覽
0 評論
6 贊
7 踩
]
概要
用 windows api 操作 ini 文件
正文
2022.7.11 更新 【封装版】
(可能有 BUG,用在打砖块项目里的那个才是更新过的)
ini.hpp
///////////////////////////////////// // // ini.hpp // ini 文件操作库 // // by huidong <mailhuid@163.com> // 2023.02.02 // #pragma once #include <Windows.h> #include <string> inline int GetIniFileInfoInt(LPCTSTR lpFileName, LPCTSTR lpAppName, LPCTSTR lpKeyName, int nDefault) { return GetPrivateProfileInt(lpAppName, lpKeyName, nDefault, lpFileName); } inline double GetIniFileInfoFloat(LPCTSTR lpFileName, LPCTSTR lpAppName, LPCTSTR lpKeyName, double dDefault) { WCHAR buf[128] = { 0 }; GetPrivateProfileString(lpAppName, lpKeyName, L"err", buf, sizeof(buf) / sizeof(WCHAR), lpFileName); if ((std::wstring)buf == L"err") return dDefault; else return _wtof(buf); } inline std::wstring GetIniFileInfoString(LPCTSTR lpFileName, LPCTSTR lpAppName, LPCTSTR lpKeyName, std::wstring strDefault, int nMaxSize = 1024) { WCHAR* buf = new WCHAR[nMaxSize]; memset(buf, 0, sizeof(WCHAR) * nMaxSize); GetPrivateProfileString(lpAppName, lpKeyName, strDefault.c_str(), buf, nMaxSize, lpFileName); std::wstring str = buf; delete[] buf; return str; } inline bool WriteIniFileInfoInt(LPCTSTR lpFileName, LPCTSTR lpAppName, LPCTSTR lpKeyName, int nValue) { WCHAR buf[12] = { 0 }; _itow_s(nValue, buf, 10); return WritePrivateProfileString(lpAppName, lpKeyName, buf, lpFileName); } inline bool WriteIniFileInfoFloat(LPCTSTR lpFileName, LPCTSTR lpAppName, LPCTSTR lpKeyName, double dValue) { WCHAR buf[12] = { 0 }; swprintf(buf, 12, L"%lf", dValue); return WritePrivateProfileString(lpAppName, lpKeyName, buf, lpFileName); } inline bool WriteIniFileInfoString(LPCTSTR lpFileName, LPCTSTR lpAppName, LPCTSTR lpKeyName, std::wstring strValue) { return WritePrivateProfileString(lpAppName, lpKeyName, strValue.c_str(), lpFileName); }
main.cpp
#include "ini.hpp" int main() { // 注意!若使用相对路径,必须加 "./" WriteIniFileInfoInt(L"./settings.ini", L"Test", L"first", 100); WriteIniFileInfoFloat(L"./settings.ini", L"Test", L"second", 720.37); WriteIniFileInfoString(L"./settings.ini", L"String", L"pp", L"hello world"); printf( "%d, %lf, %ls\n", GetIniFileInfoInt(L"./settings.ini", L"Test", L"first", -1), GetIniFileInfoFloat(L"./settings.ini", L"Test", L"second", -1.0), GetIniFileInfoString(L"./settings.ini", L"String", L"pp", L"err").c_str() ); return 0; }
--- 更新结束
#include <windows.h>
先说明ini文件的格式:
[IntSection] ;这样表示一个节,节名为IntSection key1=0 ;这是一个节里的一个键,键值为0 key2=1 ;这是一个节里的一个键,键值为1 [StringSection] ;这样表示一个节,节名为StringSection key1=hello ;这是一个节里的一个键,键值为hello key2=world ;这是一个节里的一个键,键值为world
ini文件里的字符串无需引号。
用于读写ini的函数:
读取:
//整形 int i=GetPrivateProfileInt(L"读入的节",L"读入的键",0/*读取失败返回的默认值*/,L"ini文件相对路径");//读入一个整形给i //字符串 wchar_t buf[64]; GetPrivateProfileString(L"读入的节",L"读入的键",L"error"/*读取失败返回的默认值*/,buf,sizeof(buf),L"ini文件相对路径");//读入一个字符串给buf
写入:
WritePrivateProfileString(L"写入的节",L"写入的键",L"写入的值",L"ini文件相对路径");
注意:有的时候读取ini时,中文乱码,可能是因为
1.没有setlocale
2.ini文件的格式不是ANSI