2022.7.11 更新 【封装版】
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