我正在修改现有的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?)分隔的键,所以我不得不使用如上所述的循环来提取它们 - 为了每个可能需要它的人在这里分享它。 : - )
答案 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