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

c++ boost parse ini file when containing multikeys

我需要使用带有 boost 库的 C++ 解析 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文件中的多键和return异常。所以我尝试使用函数 boost::program_options::parse_config_file(),但这不是我需要的。

我应该使用什么功能来解析 ini 文件以及我可以为每个部分获取具有相关键值的自己的结构?

可能对您有帮助的 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

您的输入根本不是 INI 文件,因为 INI 文件不允许重复值。您可以编写自己的解析器,例如使用我在这里写的代码:¹

  • Cross-platform way to get line number of an INI file where given option was found

如果替换 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]

See full code here: https://gist.github.com/sehe/068b1ae81547b98a3cec02a530f220df

¹ 或 and http://coliru.stacked-crooked.com/view?id=cd1d516ae0b19bd6f9af1e3f1b132211-0d2159870a1c6cb0cd1457b292b97230 可能还有其他人