我需要使用C ++和boost库来解析ini文件。该文件包含多个键。例如,
[section_1]
key_1=value_1
key_1=value_2
...
key_n=value_n
[section_2]
key1=value_1
key1=value_2
...
key_n=value_1
key_n=value_2
[]
...
[section_n]
...
我尝试使用boost库的功能:函数boost::property_tree::ini_parser::read_ini()
,但它不能在ini文件中包含多键并返回异常。所以我尝试使用函数boost::program_options::parse_config_file()
,但这不是我需要的。
我应该使用什么功能来解析ini文件?对于每个部分,我可以使用相关的键值来获得自己的结构?
答案 0 :(得分:0)
可能帮助您的SSCCE
<强> Live On Coliru 强>
#include <boost/property_tree/ini_parser.hpp>
#include <iostream>
using boost::property_tree::ptree;
int main() {
std::istringstream iss(R"([section_1]
key_1=value_1
key_2=value_2
key_n=value_n
[section_2]
key1=value_1
key2=value_2
key_n=value_n
key_m=value_m
[]
[section_n])");
ptree pt;
read_ini(iss, pt);
for (auto& section : pt) {
std::cout << "[" << section.first << "]\n";
for (auto& key : section.second) {
std::cout << key.first << "=" << key.second.get_value("") << "\n";
}
}
}
打印
[section_1]
key_1=value_1
key_2=value_2
key_n=value_n
[section_2]
key1=value_1
key2=value_2
key_n=value_n
key_m=value_m
答案 1 :(得分:0)
您的输入不是INI文件,因为INI文件不允许重复值。您可以编写自己的解析器,例如使用我在这里写的代码:¹
如果您替换section_t
地图
typedef std::map<textnode_t, textnode_t> section_t;
multimap
:
typedef std::multimap<textnode_t, textnode_t> section_t;
你可以解析重复的键:
[section_1]
key_1=value_1
key_1=value_2
key_n=value_n
[section_2]
key1=value_1
key2=value_2
key_n=value_1
key_n=value_2
[section_n]
请在此处查看完整代码:https://gist.github.com/sehe/068b1ae81547b98a3cec02a530f220df
¹或Learning Boost.Spirit: parsing INI和http://coliru.stacked-crooked.com/view?id=cd1d516ae0b19bd6f9af1e3f1b132211-0d2159870a1c6cb0cd1457b292b97230以及可能还有其他人