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

con*_*gan 86 c++ winapi ini fileparse

我正在尝试使用C++解析INI文件.关于什么是实现这一目标的最佳方法的任何提示?我应该使用Windows API工具进行INI文件处理(我完全不熟悉),一个开源解决方案或尝试手动解析它?

Ada*_*itz 113

如果您需要跨平台解决方案,请尝试Boost的程序选项库.

  • 这是要走的路,我不明白为什么人们只是投票不那么一般的答案. (19认同)
  • @Gollum,听起来像Windows是一个给定的依赖.使用程序选项库意味着承担另一个依赖项.有时这不是什么大问题,有时候也是. (17认同)
  • @malat我很困惑,我没有提及downvoting? (5认同)
  • Boost 的程序选项似乎使用它自己的配置格式,井号 (#) 用于注释(而不是分号)http://www.boost.org/doc/libs/1_57_0/doc/html/program_options/overview。 html#idp343291568 (2认同)
  • 他正在尝试读取现有的INI文件,使用boost不是答案,因为它使用的是INI格式. (2认同)

Joe*_*sky 111

您可以使用Windows API函数,例如GetPrivateProfileString()GetPrivateProfileInt().

  • MSDN不推荐使用GetPrivateProfileInt()和其他函数,因为它们已过时,但仍仅提供与旧的16位系统的兼容性.而不是那种使用其他方法.https://msdn.microsoft.com/en-us/library/windows/desktop/ms724345(v=vs.85).aspx (3认同)
  • 它们已经过时了,因为 MS 不希望您再使用 ini 文件,但如果您确实想要读取或写入此类文件,它们仍然是理想的选择。 (3认同)

Lar*_*lum 22

我从来没有解析过ini文件,所以我不能在这个问题上过于具体.
但我有一个建议:只要现有车轮满足您的要求,
不要重新发明轮子

http://en.wikipedia.org/wiki/INI_file#Accessing_INI_files
http://sdl-cfg.sourceforge.net/
http://sourceforge.net/projects/libini/
http://www.codeproject.com/KB /files/config-file-parser.aspx

祝好运 :)


Har*_*rom 16

我使用SimpleIni.它是跨平台的.


Dat*_*Chu 15

如果你已经在使用Qt

QSettings my_settings("filename.ini", QSettings::IniFormat);
Run Code Online (Sandbox Code Playgroud)

然后读取一个值

my_settings.value("GroupName/ValueName", <<DEFAULT_VAL>>).toInt()
Run Code Online (Sandbox Code Playgroud)

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


Mik*_*ike 8

这个问题有点陈旧,但我会发布我的答案.我已经测试了各种INI类(你可以在我的网站上看到它们),我也使用simpleIni,因为我想在windows和winCE上使用INI文件.Window的GetPrivateProfileString()仅适用于winCE上的注册表.

使用simpleIni很容易阅读.这是一个例子:

#include "SimpleIni\SimpleIni.h"    
CSimpleIniA ini;
ini.SetUnicode();
ini.LoadFile(FileName);
const char * pVal = ini.GetValue(section, entry, DefaultStr);
Run Code Online (Sandbox Code Playgroud)


nim*_*cap 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";
Run Code Online (Sandbox Code Playgroud)

作者还在此处列出了现有库.