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
#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 可能还有其他人
我需要使用带有 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
#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
¹ 或