c ++包含多个键时提升解析ini文件

时间:2017-01-17 19:09:18

标签: c++ boost ini

我需要使用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文件?对于每个部分,我可以使用相关的键值来获得自己的结构?

2 个答案:

答案 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 INIhttp://coliru.stacked-crooked.com/view?id=cd1d516ae0b19bd6f9af1e3f1b132211-0d2159870a1c6cb0cd1457b292b97230以及可能还有其他人