如果将任何注释附加到键值,Boost 属性树 ini 解析会出错

Posted

技术标签:

【中文标题】如果将任何注释附加到键值,Boost 属性树 ini 解析会出错【英文标题】:Boost property tree ini parsing gives error if any comment is appended to key-value 【发布时间】:2014-10-13 13:46:54 【问题描述】:

我有一个工作示例程序,它使用 boost property_tree 解析 ini 格式的数据。 当我向键值对附加注释时,我得到了核心转储。我在 property_tree 上搜索了任何评论修剪功能,但找不到任何东西。

工作程序:

static std::string inidata =
R"(
    # comment

    [SECTION1]  
    key1 = 15
    key2=val        
)";

void read_data(std::istream &is)

    using boost::property_tree::ptree;

    ptree pt;

    read_ini(is, pt);

    boost::optional<uint32_t>    sect1_key1 = pt.get_optional<uint32_t>(ptree::path_type("SECTION1/key1", '/'));
    boost::optional<std::string> sect1_key2 = pt.get_optional<std::string>(ptree::path_type("SECTION1/key2", '/'));

    std::cout << "SECTION1.key1: " << *sect1_key1 << std::endl;
    std::cout << "SECTION1.key2: " << *sect1_key2 << std::endl;

注释附加配置:

static std::string inidata =
R"(
    # comment

    [SECTION1]  
    key1 = 15           # COMMENT ADDED!
    key2=val        
)";

核心转储输出:

/usr/local/include/boost/optional/optional.hpp:992: boost::optional<T>::reference_type boost::optional<T>::get() [with T = unsigned int; boost::optional<T>::reference_type = unsigned int&]: Assertion `this->is_initialized()' failed.
Aborted (core dumped)

【问题讨论】:

阅读文档很难判断,但属性树 INI 解析器可能不支持内联 cmets。在这一点上,实际的 INI 规范是 vague。 【参考方案1】:

评论风格**is not supported*。

您可以通过移动文本值上的注释来看到这一点,结果是:

SECTION1.key1: 15
SECTION1.key2: val  # woah

显示# 确实只在第一个非空白列中特殊的测试器:Live On Coliru

#include <boost/property_tree/ini_parser.hpp>
#include <iostream>

static std::string inidata =
R"(
    # comment

    [SECTION1]  
    key1 = 15
    key2=val  # woah       
    k#ey3=whoops
)";

using boost::property_tree::ptree;

void read_data(std::istream &is)


    ptree pt;
    read_ini(is, pt);

    for (auto section : pt)
        for (auto key : section.second)
            std::cout << "DEBUG: " << key.first << "=" << key.second.get_value<std::string>() << "\n";


#include <sstream>

int main()

    std::istringstream iss(inidata);
    read_data(iss);

【讨论】:

谢谢。我认为在键和值上搜索评论字符是手动需要的(修剪目的)。 @tyilmaz 要么这样,要么您可以通过其他方式读取 inifile:Boost Program Options does strip trailing comments 或 this inifile parser I wrote in Boost Spirit(您可以将 POSITION_INFO 定义为 0

以上是关于如果将任何注释附加到键值,Boost 属性树 ini 解析会出错的主要内容,如果未能解决你的问题,请参考以下文章

使用 boost 属性树遍历 json 属性键和值

提升属性树值(反)序列化

如何将文本附加到特定的php数组值

vs2010 读写注册表时发现无法读取到键值

我们如何在 boost 属性树中获取对象

使用 INI 文件提升属性树