什么是在C++中解析INI文件的最简单方法?

92

我正在尝试使用C++解析INI文件。有什么最佳实践来实现这一目标吗?我应该使用Windows API提供的INI文件处理工具(我对此完全不熟悉),选择开源解决方案还是尝试手动解析呢?

13个回答

122
如果您需要一个跨平台的解决方案,可以尝试使用Boost的Program Options库。

22
这是正确的方法,我不明白为什么人们只投票支持非常具体的答案。 - Ramadheer Singh
21
@Gollum,听起来Windows是必备的依赖项。使用Program Options库意味着承担另一个依赖关系。有时这并不是很重要,有时候却很重要。 - I. J. Kennedy
2
Boost的程序选项似乎使用自己的配置格式,井号(#)用于注释(而不是分号)http://www.boost.org/doc/libs/1_57_0/doc/html/program_options/overview.html#idp343291568 - malat
5
我有点困惑,我没有提到下投票? - sjdowling
3
他正试图读取一个已存在的INI文件,使用boost并不是一个解决方案,因为它使用的是类似INI格式的文件。 - Lothar
显示剩余4条评论

120

4
MSDN 不推荐使用 GetPrivateProfileInt() 和其他函数,因为它们已经过时,只为向旧的 16 位系统提供向后兼容性而保留。 应该使用其他方法来代替。 https://msdn.microsoft.com/zh-cn/library/windows/desktop/ms724345(v=vs.85).aspx - Zdeno Pavlik
8
因为微软不再希望你使用ini文件,所以它们已经过时了。但如果你确实需要读取或编写这样的文件,它们仍然是最理想的选择。 - Neil
仍然工作良好 :) - rogerdpack

23

20
如果您已经在使用Qt
QSettings my_settings("filename.ini", QSettings::IniFormat);

然后读取一个值

my_settings.value("GroupName/ValueName", <<DEFAULT_VAL>>).toInt()

还有一堆其他的转换器可以将您的INI值转换为标准类型和Qt类型。有关更多信息,请参阅QSettings的Qt文档。


还不错,尽管如果您进行更改,它们会将更改保存回.ini文件中,而不会真正告诉您(即析构函数调用sync(),这可能会让人感到惊讶),并且这会破坏以前定义变量的注释和顺序... - Alexis Wilke
QSettings 也是区分大小写的,一些 SomKeyName 和 somekeyname 不相同。这个模块中存在一些糟糕的设计决策。 - TSG

16

我使用 SimpleIni,它可以跨平台使用。


SimpleIni现在托管在Github上。 - Richard Ye
它似乎支持Visual Studio和GCC,采用MIT许可证。截至撰写本文时,其自动构建失败,最后一次发布是在2013年9月,最后一次提交是在2020年6月。 - jrh

8
这个问题有点老,但我会发表我的答案。我已经测试了各种INI类(您可以在我的网站上看到它们),我也使用simpleIni,因为我想在Windows和WinCE上处理INI文件。Windows的GetPrivateProfileString()仅适用于WinCE上的注册表。
使用simpleIni非常容易阅读。这是一个例子:
#include "SimpleIni\SimpleIni.h"    
CSimpleIniA ini;
ini.SetUnicode();
ini.LoadFile(FileName);
const char * pVal = ini.GetValue(section, entry, DefaultStr);

6

inih是一个用C语言编写的简单INI解析器,还附带有C++封装。以下是使用示例:

#include "INIReader.h"    

INIReader reader("test.ini");

std::cout << "version="
          << reader.GetInteger("protocol", "version", -1) << ", name="
          << reader.Get("user", "name", "UNKNOWN") << ", active="
          << reader.GetBoolean("user", "active", true) << "\n";

作者还有一个现有库的列表在这里


4

我最终使用了未在此帖中提到的inipp。

https://github.com/mcmtroffaes/inipp

这是一个MIT许可证的头文件实现,非常简单易用,只需要将其添加到项目中,再加上四行代码即可。


4
你尝试过libconfig吗?它的语法很像JSON。我更喜欢它而不是XML配置文件。

3
如果您对平台可移植性感兴趣,您也可以尝试Boost.PropertyTree。它支持ini作为持久性格式,尽管属性树可能只有1级深度。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接