:: GetPrivateProfileString读取INI文件的整个部分

时间:2010-12-26 13:52:06

标签: c++ windows winapi configuration-files ini

我正在修改现有的C ++应用程序并删除一些当前硬编码的值。

我正在使用一个类“管理”整个事件,并保存INI文件中的map<CString, CString>个值。

现在我必须使用::GetPrivateProfileString函数分别读取每个值 - 我可以以某种方式读取整个部分而不是单个值吗?

不希望不必手动阅读文件,但如果有任何合理的(即有效且易于使用)现有方式,我愿意接受建议。

编辑:刚才必须使用它“for real”,解决方案确实传递了NULL作为 lpKeyName 值。完整代码包括解析返回值:

char buffer[MAX_STRING_SIZE];
int charsCount = ::GetPrivateProfileString("MySection", NULL, NULL, buffer, MAX_STRING_SIZE, m_strIniPath);
CString curValue;
curValue.Empty();
char curChar = '\0';
for (int i = 0; i < charsCount; i++)
{
    curChar = buffer[i];
    if (curChar == '\0')
    {
        if (curValue.GetLength() > 0)
            HandleValue(curValue);
        curValue.Empty();
    }
    else
    {
        curValue.AppendFormat("%c", curChar);
    }
}
if (curValue.GetLength() > 0)
    HandleValue(curValue);

它不是微不足道的,因为它返回由零字符(EOS?)分隔的键,所以我不得不使用如上所述的循环来提取它们 - 为了每个可能需要它的人在这里分享它。 : - )

3 个答案:

答案 0 :(得分:3)

您应该考虑使用Boost.PropertyTree(提供INI parser):

  

属性树库提供了一个   存储数据结构   任意深度嵌套的树   值,由某些人在每个级别索引   键。树的每个节点都存储它   自己的价值,加上它的有序列表   子节点及其键。那个树   允许轻松访问其任何节点   通过路径,这是一个   多个密钥的串联。

     

此外,图书馆提供   解析器和生成器的数量   可以表示的数据格式   通过这样的树,包括XML,INI,   和JSON。

答案 1 :(得分:3)

您无需手动阅读该文件,但有助于阅读GetPrivateProfileString的手册:

  

lpKeyName [in]:密钥的名称   其相关字符串   检索。 如果此参数为NULL,   指定部分中的所有键名   通过lpAppName参数进行复制   到由指定的缓冲区   lpReturnedString参数

答案 2 :(得分:2)

你看过GetPrivateProfileSection吗? http://msdn.microsoft.com/en-us/library/ms724348(VS.85).aspx