我正在考虑为我的代码创建一个输入/日志文件,主要用于两个目的。
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
属性以及Domain
,Levels
和Path
部分(例如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是我拥有的最佳选择,还是应该考虑更改为其他格式?
答案 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类注释)。以来 注释在配置/输入文件中很有用,此功能是 保留。