4

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

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

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

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

编辑:刚才不得不“真正地”使用它,并且解决方案确实将 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?)分隔的键,所以我必须使用上述循环提取它们 - 为了每个可能需要它的人,在这里分享它。:-)

4

3 回答 3

3

您可能应该考虑使用Boost.PropertyTree(它提供了一个INI 解析器):

属性树库提供了一种数据结构,用于存储任意深度嵌套的值树,并在每个级别通过某个键进行索引。树的每个节点都存储自己的值,以及其子节点及其键的有序列表。树允许通过路径轻松访问其任何节点,路径是多个键的串联。

此外,该库还为可以用这种树表示的多种数据格式提供解析器和生成器,包括 XML、INI 和 JSON。

于 2010-12-26T14:16:32.693 回答
3

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

lpKeyName [in] :要检索其关联字符串的键的名称。如果此参数为 NULL,则 lpAppName 参数指定的部分中的所有键名都将复制到 lpReturnedString 参数指定的缓冲区

于 2010-12-26T15:15:02.437 回答
2

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

于 2010-12-26T15:39:59.823 回答