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

input file format for my code using boost::property_tree

本文关键字:输入 文件 代码 格式 boost propertytree 使用 我的      更新时间:2023-10-16

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

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

我对只使用头的方法很感兴趣,这样我就可以简单地将头文件与代码一起携带,因此我将其转换为boost.properties_tree。从文档来看,它似乎达到了目的。我的问题是哪种文件格式最符合我的需求?我需要一些东西:

1) 易于阅读/编辑2) 可以支持嵌套节3) 可以支持评论

默认情况下,我已经转向xml,但考虑到boost.properties_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是我的最佳选择,还是应该考虑更改为另一种格式?

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

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

如果在持久化文件中保留数值类型对您来说很重要,我会查看JSONCp。我自己也用过,它很容易起床和跑步,而且重量很轻。

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

注意:注释过去在JSON中受支持,但在可移植性(Python中不支持类似C的注释)。自从注释在配置/输入文件中很有用,该功能保存。

好的,我想我找到了一种处理多个值的方法。一种方法是将整件事读成std::string,然后使用std::istringstream可以非常容易地分离每个部分。类似这样的东西:

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

效果很好。然而,我不知道如何获得Type属性。。。