zoukankan      html  css  js  c++  java
  • C++读写ini配置文件

    在Windows的VC下

    读ini文件

    例如:在D: est.ini文件中

    [Font]
    name=宋体
    size= 12pt
    color = RGB(255,0,0)

    上面的=号两边可以加空格,也可以不加

    GetPrivateProfileInt()和GetPrivateProfileString()

    [section]
    key=string
          .
          .
    
    获取integer
    UINT GetPrivateProfileInt(
      LPCTSTR lpAppName,  // section name
      LPCTSTR lpKeyName,  // key name
      INT nDefault,       // return value if key name not found
      LPCTSTR lpFileName  // initialization file name
    );
    
    注意:lpAppName和lpKeyName不区分大小写,当获得integer <0,那么返回0。lpFileName  必须是绝对路径,因相对路径是以C:windows
    
    DWORD GetPrivateProfileString(
      LPCTSTR lpAppName,        // section name
      LPCTSTR lpKeyName,        // key name
      LPCTSTR lpDefault,        // default string
      LPTSTR lpReturnedString,  // destination buffer
      DWORD nSize,              // size of destination buffer
      LPCTSTR lpFileName        // initialization file name
    );
    
    注意:lpAppName和lpKeyName不区分大小写,若lpAppName为NULL,lpReturnedString缓冲区内装载这个ini文件所有小节的列表,若为lpKeyName=NULL,就在lpReturnedString缓冲区内装载指定小节所有项的列表。lpFileName  必须是绝对路径,因相对路径是以C:windows,
    返回值:复制到lpReturnedString缓冲区的字符数量,其中不包括那些NULL中止字符。如lpReturnedString缓冲区不够大,不能容下全部信息,就返回nSize-1(若lpAppName或lpKeyName为NULL,则返回nSize-2)
    
    获取某一字段的所有keys和values
    DWORD GetPrivateProfileSection(
      LPCTSTR lpAppName,        // section name
      LPTSTR lpReturnedString,  // return buffer
      DWORD nSize,              // size of return buffer
      LPCTSTR lpFileName        // initialization file name
    );
    
    retrieves the names of all sections in an initialization file.
    DWORD GetPrivateProfileSectionNames(
      LPTSTR lpszReturnBuffer,  // return buffer
      DWORD nSize,              // size of return buffer
      LPCTSTR lpFileName        // initialization file name
    );
    其实就等于,GetPrivateProfileString(NULL,NULL,lpszReturnedBuffer,nSize,lpFileName)
    View Code

     例子:

        /* test.ini  "="号两边可以加空格,也可以不加
        [Font]
        name=宋体
        size= 12pt
        color = RGB(255,0,0)
        [Layout]
        [Body]
        */
    
        CString strCfgPath = _T("D:\test.ini"); //注意:'\'
        LPCTSTR lpszSection = _T("Font");
        int n = GetPrivateProfileInt(_T("FONT"), _T("size"), 9, strCfgPath);//n=12
        CString str;
        GetPrivateProfileString(lpszSection, _T("size"), _T("9pt"), str.GetBuffer(MAX_PATH), MAX_PATH, strCfgPath);
        str.ReleaseBuffer();//str="12pt"
    
        TCHAR buf[200] = { 0 };
        int nSize = sizeof(buf) / sizeof(buf[0]);
        GetPrivateProfileString(lpszSection, NULL, _T(""), buf, nSize, strCfgPath);
        //buf: "namesizecolor"
    
        memset(buf, 0, sizeof(buf));
        GetPrivateProfileString(NULL, _T("size"), _T(""), buf, nSize, strCfgPath);//没Section,_T("size")没意义了,所以可以写NULL
        //可以是 GetPrivateProfileString(NULL, NULL, _T(""), buf, nSize, strCfgPath);
        //buf: "FontLayoutBody"
    
        memset(buf, 0, sizeof(buf));
        GetPrivateProfileSection(lpszSection, buf, nSize, strCfgPath);
        //buf: "name=宋体size=12ptcolor=RGB(255,0,0)"   此时“=”两边不会有空格
    
        memset(buf, 0, sizeof(buf));
        GetPrivateProfileSectionNames(buf, nSize, strCfgPath);//等于GetPrivateProfileString(NULL, NULL, _T(""), buf, nSize, strCfgPath);
        //buf: "FontLayoutBody"

     写ini文件

    WritePrivateProfileString函数,没有写integer的,可以转成string再写入。

    BOOL WritePrivateProfileString(
      LPCTSTR lpAppName,  // section name
      LPCTSTR lpKeyName,  // key name
      LPCTSTR lpString,   // string to add
      LPCTSTR lpFileName  // initialization file
    );
    
    The WritePrivateProfileSection function replaces the keys and values for the specified section in an initialization file. 
    
    BOOL WritePrivateProfileSection(
      LPCTSTR lpAppName,  // section name
      LPCTSTR lpString,   // data
      LPCTSTR lpFileName  // file name
    );

    WritePrivateProfileString:

    Remarks

    If the lpFileName parameter does not contain a full path and file name for the file, WritePrivateProfileString searches the Windows directory for the file. If the file does not exist, this function creates the file in the Windows directory.

    If lpFileName contains a full path and file name and the file does not exist, WritePrivateProfileString creates the file. The specified directory must already exist.

    WritePrivateProfileSection:

    Remarks

    The data in the buffer pointed to by the lpString parameter consists of one or more null-terminated strings, followed by a final null character. Each string has the following form:

    key=string

    The WritePrivateProfileSection function is not case-sensitive; the string pointed to by the lpAppName parameter can be a combination of uppercase and lowercase letters.

    If no section name matches the string pointed to by the lpAppName parameter, WritePrivateProfileSection creates the section at the end of the specified initialization file and initializes the new section with the specified key name and value pairs.

    WritePrivateProfileSection deletes the existing keys and values for the named section and inserts the key names and values in the buffer pointed to by the lpString parameter. The function does not attempt to correlate old and new key names; if the new names appear in a different order from the old names, any comments associated with preexisting keys and values in the initialization file will probably be associated with incorrect keys and values.

    This operation is atomic; no operations that read from or write to the specified initialization file are allowed while the information is being written.

     例子:

        WritePrivateProfileString(_T("Layout"), _T("left"), _T("100"), strCfgPath);
        WritePrivateProfileString(_T("Layout"), _T("top"), _T("80"), strCfgPath);
        //删除某Section,包括[Layout]和其下所有Keys=Value
        WritePrivateProfileSection(_T("Layout"), NULL, strCfgPath);
        //删除某Section,包括[Layout]下所有Keys=Value,但不删除[Layout]
        WritePrivateProfileSection(_T("Layout"), _T(""), strCfgPath);
    //而:WritePrivateProfileSection(NULL, NULL, strCfgPath);什么也不做,因Section为NULL

    自己封装的函数:
    获取某一个Section的所有 key=value
    map<CString, CString> GetKeysValues(LPCTSTR szSection, LPCTSTR szIniFilePath)
    获取ini文件的所有Section名
    vector<CString> GetSectionsNames(LPCTSTR szIniFilePath)

    #include <vector>
    #include <map>
    using std::vector;
    using std::map;
    //获取ini文件的所有Section名
    vector<CString> GetSectionsNames(LPCTSTR szIniFilePath)
    {
        vector<CString> vRet;
        TCHAR buf[2048] = { 0 };
        long nSize = sizeof(buf) / sizeof(buf[0]);
        ::GetPrivateProfileSectionNames(buf, nSize, szIniFilePath);
        TCHAR *p, *q;
        p = q = buf;
        while (*p)//即 '' != *p
        {
            while (*q)
            {
                ++q;
            }
            CString str(p, q - p);
            vRet.push_back(str);
            p = q + 1;
            q = q + 1;
        }
        return vRet;
    }
    //获取某一个Section的所有 key=value
    map<CString, CString> GetKeysValues(LPCTSTR szSection, LPCTSTR szIniFilePath)
    {
        map<CString,CString> mapRet;
        TCHAR buf[2048] = { 0 };
        long nSize = sizeof(buf) / sizeof(buf[0]);
        GetPrivateProfileSection(szSection, buf, nSize, szIniFilePath);
        TCHAR* p = buf;
        TCHAR* q = buf;
        while (*p)
        {
            CString strKey, strValue;
            while(*q)
            {
                if (_T('=') == *q)
                {
                    strKey = CString(p, q - p);
                    p = q + 1;
                }
                ++q;
            }
            strValue = CString(p, q - p);
            mapRet.insert(std::make_pair(strKey, strValue));
            p = q + 1;
            q = q + 1;
        }
        return mapRet;
    }
    View Code

     相关知识链接

    www.cnblogs.com/lishennan/p/5165136.html
    blog.csdn.net/thanklife/article/details/52953475
    blog.csdn.net/Dstar2/article/details/70242161/


    常记溪亭日暮,沉醉不知归路。兴尽晚回舟,误入藕花深处。争渡,争渡,惊起一滩鸥鹭。

    昨夜雨疏风骤,浓睡不消残酒。试问卷帘人,却道海棠依旧。知否?知否?应是绿肥红瘦。
  • 相关阅读:
    Mybatis(二) Mybatis通用的写法
    Mybatis(一)Mybatis相关概念
    NodeJS添加Jquery依赖
    安卓、IOS端AEC密钥加密 Java端密钥解密通用实现(16进制表现形式)
    关于博客园首页及详情页美化的代码
    MD5用户密码加密工具类 MD5Util
    .Net Core跨平台应用研究-CustomSerialPort(增强型跨平台串口类库)
    FtpServer穿透内网访问配置踩坑笔记
    .Net Core之编辑json配置文件
    玩转MQTT-阿里云之MQTT使用(下)
  • 原文地址:https://www.cnblogs.com/htj10/p/11741895.html
Copyright © 2011-2022 走看看