C++ Boost解析INI文件包含多个键时的方法

4

我需要使用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文件中的多个键并返回异常。因此,我尝试使用函数boost::program_options::parse_config_file(),但这不是我需要的。
我应该使用哪种功能来解析ini文件,并为每个部分获取自己的结构与相关键值?

你没有解释什么是“多键”。这个例子不一致(看起来你想要key_1key_2...,key_n,但它也可以是key1key2...,key<n>或者甚至是key1key1key1。方括号[]的出现完全没有解释。 - sehe
多键是指两个或更多相同的键值。我只是举了一个例子,以便理解在我的情况下什么构成了ini文件。我的问题是使用boost功能(如果可用)来访问已解析的键和相应值的值,而不会发生键冲突(或多个键)。这就是我的意思。 - voiko
你需要展示给我们,当使用某些boost库或其他方式解析文件后,你期望得到什么样的数据结构。同时,为你所发布的输入添加一个期望输出的示例。目前来看,你的问题不够清晰明了。 - Mike Kinghan
好的,我会尝试描述我的目的。我有一个外部获取的ini文件,其中包含有关证书链(最终证书、内部证书、CRL等)的信息,即我的ini文件: [cert chain 1] final cert = name cert1 internal cert=name cert2 ... internal cert=name cert_n other keys = ... [cert chain 2] ... 我需要解析这种类型的ini文件,但我遇到了使用boost函数property_tree :: read_ini()无法解析内部证书的问题。我想知道使用boost解析此文件的方法。附言:我无法编辑此文件。 - voiko
2个回答

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

¹ 或者 学习 Boost.Spirit:解析 INI 文件http://coliru.stacked-crooked.com/view?id=cd1d516ae0b19bd6f9af1e3f1b132211-0d2159870a1c6cb0cd1457b292b97230,以及可能的其他链接。


0

以下是一个可能对您有帮助的SSCCE示例

在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是no。正如我在上面的评论中所描述的那样,我的ini文件可能会出现在一个部分中键相同的情况。 - voiko
如何更改section_1中的key_n值? - JamesWebbTelescopeAlien

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接