0

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

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 是我拥有的最佳选择还是应该考虑更改为另一种格式?

4

2 回答 2

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财产的方法...

于 2012-09-27T22:06:26.143 回答
0

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

重要警告:boost::property_tree 在内部将值视为字符串,因此,如果您想要可以在程序外部读取的有效 JSON,您将无法直接从使用 boost::property_tree 创建的 JSON 中读取数值而不执行一些操作某种演员表(取决于阅读代码)。

如果在持久文件中保留数值类型对您很重要,我会检查JSONCpp。我自己用过它,它很容易启动和运行,而且非常轻巧。

JSONCpp 也支持注释。从 SourceForge 页面:

注意:JSON 中曾经支持注释,但为了可移植性而将其删除(Python 不支持类似 C 的注释)。由于注释在配置/输入文件中很有用,因此保留了此功能。

于 2012-09-28T00:03:16.470 回答