使用boost::propertytree为我的代码输入文件格式
input file format for my code using boost::property_tree
我正在考虑为我的代码创建一个输入/日志文件,主要有两个目的。
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
属性以及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是我的最佳选择,还是应该考虑更改为另一种格式?
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
属性。。。
- 用c++从输入文件中读取另一行
- 更改.cpp程序的输入文件中数据的位置会意外更改输出
- 获取通过重定向传入的输入文件的名称?
- C++ 如何打开带有另一个目录的输入文件?
- C++模板编程设计问题 - 根据输入文件返回不同的类型
- 如何从输入文件 c++ 创建随机名称生成器
- 从输入文件修剪空格
- 链接器输入文件未使用,因为链接未完成,我无法获得.o
- 我正在尝试从输入文件中读取,然后使用它们的子字符串比较字符串的特定部分
- 我遇到使用 c++ 逐行读取输入文件的问题
- 使用重定向命令从 stdin 读入的字符串"<"输入文件未正确附加
- 使用 getline 从输入文件打印时如何忽略空白行
- 如何按升序对输入文件中的数字进行排序,并找到它们的范围和中值
- 数组大小由输入文件中的行数定义
- 从C++输入文件读取
- 在课堂上创建了一个朋友,给出"无输入文件"错误
- 通过显示一行星号来创建条形图,该条形图将读取数据的输入文件
- 利用输入文件中的数据(字符串和int)并在循环中利用
- C++ 仅读取输入文件中的部分(不是全部)数据以添加到记录中
- 如何从输入文件中读取字符并将其存储到向量中?