使用boost :: property_tree输入我的代码的文件格式

时间:2012-09-27 21:48:48

标签: c++ boost boost-propertytree

我正在考虑为我的代码创建一个输入/日志文件,主要用于两个目的。

1)能够记录运行代码的所有关键参数,以便我可以在将来重现相同的结果。 2)能够启动/恢复代码,而无需对代码中的参数进行硬编码。

我对仅使用标题的方法感兴趣,因此我可以简单地将头文件与我的代码一起携带,因此我已经变成了boost.property_tree。从文档中可以看出它的用途。我的问题是哪种文件格式最符合我的需求?我需要一些东西:

1)易于人类阅读/编辑 2)可以支持嵌套部分 3)可以支持评论

默认情况下,我已经转向xml,但我不确定这是考虑解析boost.property_tree功能的最佳选择。例如,我希望能够解析这样的事情:

<Grid Type = "AMR">
    <Domain> -1.0 1.0 -1.0 1.0 </Domain>
    <Levels> 10 5 </Levels>
    <Path> /path/to/data.bin </Path>
</Grid>

我希望能够正确地和单独地阅读Type属性以及DomainLevelsPath部分(例如Domain有4个独立的浮点,对应于矩形的边缘)。我的代码如下所示:

using boost::property_tree::ptree;
ptree pt;

double x = pt.get<double>("Grid.Domain");

std::cout << x << std::endl;

但我一直在conversion of data to type "d" failed。我该如何解决?另外,xml是我拥有的最佳选择,还是应该考虑更改为其他格式?

2 个答案:

答案 0 :(得分:0)

好吧我觉得我找到了一种处理多个值的方法。一种方法是将整个内容读作std::string,然后使用std::istringstream,您可以非常轻松地分隔每个部分。像这样:

std::istringstream iss(pt.get<std::string>("Grid.Domain"));
double xmin, xmax, ymin, ymax;
iss >> xmin >> xmax >> ymin >> ymax;

效果很好。但我不知道如何获得Type属性......

答案 1 :(得分:0)

boost :: property_tree还支持与JSON进行序列化/反序列化。 JSON允许数组,因此很容易为一个部分存储多个值。您甚至可以使用JSON存储结构(如果您想要保持程序中对象的状态,这可能很方便)。

重要警告:boost :: property_tree在内部将值视为字符串,因此如果您想要在程序外部读取有效的JSON,则无法直接从JSON读取数值你使用boost :: property_tree创建而不执行某种强制转换(取决于阅读代码)。

如果保留持久文件中的数值类型对您很重要,我会查看JSONCpp。我自己使用它,它很容易起床和运行,而且非常轻巧。

JSONCpp也支持评论。从SourceForge页面:

  

注意:以前在JSON中支持注释但删除了注释   可移植性(Python中不支持C类注释)。以来   注释在配置/输入文件中很有用,此功能是   保留。