【问题标题】:c++ boost parse ini file when containing multikeysc ++ boost在包含多键时解析ini文件
【发布时间】:2017-06-01 23:38:10
【问题描述】:

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

【问题讨论】:

  • 你没有解释什么是“多键”。该示例不一致(看起来您希望拥有key_1key_2...、key_n,但也可以是key1key2...、key<n> 甚至@ 987654330@,key1key1[]的出现完全无法解释。
  • 多键是两个或多个相同的键值。我只是举了一个例子来理解什么是我的例子中的ini文件。我的问题的目的是使用增强功能(如果可用)来访问键的解析值和相应的值,而不会发生冲突键(或多键)。这就是我的意思。
  • 您需要向我们展示您希望在解析此类文件后得到的数据结构类型,无论是使用一些 boost 库还是其他任何东西。为您发布的输入添加所需输出的插图。就目前而言,不清楚你在问什么。
  • 好的,我将尝试描述我的目的。我有 ini 文件,它会在外面。它包含有关证书链(最终证书、内部证书、CRL 等)的信息,即我的 ini 文件: [cert chain 1] final cert = name cert1 internal cert=name cert2 ... internal cert=name cert_n other keys = . .. [证书链2] ...我需要解析这种类型的ini文件,但是我遇到了解析内部证书的问题,而使用boost的函数property_tree::read_ini()无法解析。我想知道使用 boost 解析这个文件的方法。附:我无法编辑此文件。

标签: c++ boost ini


【解决方案1】:

您的输入根本不是 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 以及可能的其他人

【讨论】:

    【解决方案2】:

    一个可以帮助你的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
    

    【讨论】:

    • 我同意这段代码可以工作,但在这种情况下,multikeys 不是,正如我在上面的评论中所描述的,我的 ini 文件可能是这样一个部分中的键可能相同。
    • 如何更改 section_1 中的 key_n 值?
    猜你喜欢
    • 1970-01-01
    • 2015-06-03
    • 2013-02-17
    • 2011-09-04
    • 2012-10-15
    • 2015-07-26
    • 1970-01-01
    • 1970-01-01
    • 2012-11-18
    相关资源
    最近更新 更多