匯東網


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

[ 6] [ 7]


 評論區  0 條評論

+ 添加評論