gpt4 book ai didi

c++ - 如何有效地将具有可变长度成员的对象保存到二进制文件中?

转载 作者:行者123 更新时间:2023-11-30 04:27:26 26 4
gpt4 key购买 nike

我正在使用 C++ 并正在编写一个预算程序(我知道有很多可用的程序——这只是一个学习项目)。

我想保存我所说的包含其他对象(例如“页面”)的书籍对象。页面还包含现金流量和分录。问题是可以有任何数量的分录或现金流量。

我找到了很多关于将数据保存到文本文件的信息,但这不是我想要做的。

我曾尝试研究使用 boost 库,因为有人告诉我序列化可能是解决此问题的方法。我不完全确定 boost 的哪些功能会有所帮助,甚至不确定使用 boost 的正确方法是什么。

我见过的大多数二进制文件示例都包含具有固定大小成员的对象。例如,一个点可能包含一个 x 值和一个 y 值,它们都是 double 值。情况总是如此,因此使用 sizeOf(Point) 很简单。

所以,我要么在寻找这个问题的直接答案,要么在寻找有关如何解决我的问题的信息的有用链接。但请确保您的链接是特定于问题的。

我还在 cplusplus 上发布了同样的问题

最佳答案

一般来说,有两种存储变长记录的方法:

  1. 首先存储大小整数,然后是数据。
  2. 存储数据,在末尾附加一个标记字符(或值)。

C 风格的字符串使用第二个选项。
对于选项一,数字包含数据的大小。

可选字段

如果您考虑为可选字段设计关系数据库,您将有一个包含已知或固定记录的表和另一个包含带有记录 ID 的选项字段的表。

更简单的途径可能是转到类似于 XML 的内容:字段标签。
将您的对象分成两部分:静态字段和可选字段。静态字段部分后面将跟一个可选的字段部分。可选字段部分将包含字段名称,后跟字段数据。读入字段名称,然后读入值。

我建议您检查您的设计,看看是否可以删除可选字段。此外,对于复杂的字段,让他们读入自己的数据。

存储二进制数据

如果数据在平台之间共享,请考虑使用 ASCII 或文本表示。

阅读字节序和位大小。例如,一个平台可以首先存储其二进制表示最低有效字节并使用 32 位(4 字节)。接收平台,64位,最高有效字节在前,直接读取数据会有问题,需要转换;从而失去二进制存储的任何好处。

同样, float 在二进制中也表现不佳。在浮点格式之间转换时,还会损失精度。

当使用二进制格式的可选字段时,人们会使用标记字节或数字作为字段 ID 而不是文本名称。

此外,文本格式的数据比二进制格式的数据更容易调试。

考虑使用数据库

参见 At what point is it worth using a database?

关于c++ - 如何有效地将具有可变长度成员的对象保存到二进制文件中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10963471/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com