【问题标题】:Writing and Reading boost Property Tree From/To File?从/到文件写入和读取提升属性树?
【发布时间】:2021-12-26 00:38:19
【问题描述】:

我想将boost::property_tree::ptree 二进制文件写入文件,然后再次将其读入ptree

因为我对 ptree 和二进制写入/读取它们不太满意。我认为你们可以引导我走向正确的方向。

编写字符串,int/float/double 不是什么大问题,但是如何将整个 ptree(具有未知的键和值,因此它是通用的)存储到文件中并使用 if-/ 在 cpp 中读回它流的?

Filer 扩展名将是“*.tgasset”,并且文件将包含比 ptree 更多的数据。

为了让我更容易..这些是我写入/读取数据的虚拟函数:

void TGS_File::PTreeToFile(std::ofstream &_file, boost::property_tree::ptree _data) {

}

boost::property_tree::ptree TGS_File::PTreeFromFile(std::ifstream &_file) {
    boost::property_tree::ptree _data;

    return _data;
}

(以同样的方式使用字符串、整数、浮点数和双精度数)

【问题讨论】:

  • 读/写应该是二进制的 if-/ofstream,因为 ptree 不是这个文件中唯一的数据,稍后。意思是,我不能使用 XML 和 json 解析器。
  • @BDC_Patrick 问题可能归结为将所有内容映射到 POC,它可以简单地以二进制格式存储。这是一件很难的事情,特别是在使用任何指针链接的情况下。您可能会更好,为您的类类型提供适当的 json 或 XML 解析器并使用映射器。
  • ptree 数据仅由 std::string、int、float、double 和 bools 等类型组成。没有指针,只是普通数据。想过遍历键/路径并将它们+值写入文件..但不知道如何。
  • 是的,这就是我说的原因。您需要一个合适的映射器类,std::string 不是 POD 类型,可以直接序列化为二进制文件。
  • 是的。我的 StringToFile 函数从字符串中创建一个 char* 缓冲区并将其存储在文件中????。好的..会搜索那个。

标签: c++ boost ifstream ofstream ptree


【解决方案1】:

您必须选择一种格式:INI、Json、XML 或 INFO。每个都有自己的限制:https://www.boost.org/doc/libs/1_77_0/doc/html/property_tree/parsers.html

例如如果你选择 JSON:

#include <boost/property_tree/json_parser.hpp>

void TGS_File::PTreeToFile(std::ofstream &_file, boost::property_tree::ptree _data) {
     write_json(_file, _data);
}

boost::property_tree::ptree TGS_File::PTreeFromFile(std::ifstream &_file) {
    boost::property_tree::ptree _data;
    read_json(_file, _data);
    return _data;
}

其他格式的过程与 99% 相同。粗略地说(根据记忆),我认为 INFO 格式在往返过程中丢失的信息量最少。

【讨论】:

  • Yes.. 但这会写一个 *.json、*.xml 等.. 但我需要使用自己的扩展将更多信息写入同一个文件而不仅仅是 ptree(参见 OP )。
  • 那你必须决定怎么做。这 100% 取决于您的其他需求,即周围元素的格式。既然你没有告诉我/我们有关这方面的任何事情,我们无能为力。我可以编造一些东西,但你很可能会说“这对我不起作用,因为 XYZ 有魔法惊喜”
  • 为了好玩,这是一个天真地在 base64 中编码每个值并引用各个值的解决方案。这种格式不传递任何结构,但它确实保证了编码的中立性和消息框架:Live On Coliru 我 100% 确信您会找到“这对您不起作用”的原因。那是因为你需要设计自己的文件格式!
  • 添加了一个往返测试(修复了双重的有损序列化,“Turd Polishing”下的文件):coliru.stacked-crooked.com/a/47e9fe3b2572b88d
  • 不知道解析器可以用来将json字符串直接写入其他文件。这改变了一些东西。谢谢@sehe
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多