Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何有效地将具有可变长度成员的对象保存到二进制文件中? 我正在使用C++,我正在编写一个预算程序(我知道很多都是可用的),它只是一个学习项目。p>_C++_Serialization_Boost_File Io - Fatal编程技术网

如何有效地将具有可变长度成员的对象保存到二进制文件中? 我正在使用C++,我正在编写一个预算程序(我知道很多都是可用的),它只是一个学习项目。p>

如何有效地将具有可变长度成员的对象保存到二进制文件中? 我正在使用C++,我正在编写一个预算程序(我知道很多都是可用的),它只是一个学习项目。p>,c++,serialization,boost,file-io,C++,Serialization,Boost,File Io,我想保存一个我称之为book的对象,该对象包含其他对象,如“pages”。页面还包含现金流和分录。问题是可以有任何数量的分录或现金流 我发现了很多关于将数据保存到文本文件的信息,但这不是我想要做的 我已经尝试过使用boost库,因为我被告知序列化可能是这个问题的解决方案。我不完全确定boost的哪些功能会有所帮助,甚至不确定使用boost的正确方法 我所看到的大多数二进制文件示例都是具有固定大小成员的对象。例如,点可能包含双倍的x值和y值。情况总是这样,所以只需使用sizeOf(Point)就很

我想保存一个我称之为book的对象,该对象包含其他对象,如“pages”。页面还包含现金流和分录。问题是可以有任何数量的分录或现金流

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

我已经尝试过使用boost库,因为我被告知序列化可能是这个问题的解决方案。我不完全确定boost的哪些功能会有所帮助,甚至不确定使用boost的正确方法

我所看到的大多数二进制文件示例都是具有固定大小成员的对象。例如,点可能包含双倍的x值和y值。情况总是这样,所以只需使用sizeOf(Point)就很简单了

所以,我要么寻找这个问题的直接答案,要么寻找关于如何解决我的问题的有用链接。但是请确保你的链接是针对这个问题的

我也在

上发布了同样的问题


boost::serialization
处理用户编写的类以及STL容器:
std::deque
std::list
,等等。

通常,有两种方法存储可变长度记录:

  • 首先存储大小整数,然后是数据
  • 存储数据,在末尾附加一个前哨字符(或值)
  • C样式字符串使用第二个选项。
    对于选项一,数字包含数据的大小

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

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

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

    存储二进制数据

    如果数据在平台之间共享,请考虑使用ASCII或文本表示。 读取端度和位大小。例如,一个平台可以首先存储其二进制表示最低有效字节,并使用32位(4字节)。接收平台,64位,最高有效字节优先,直接读取数据会有问题,需要转换;因此失去了二进制存储的任何好处

    类似地,浮点在二进制中也不好用。在浮点格式之间转换时,也会丢失精度

    在二进制中使用可选字段时,可以使用sentinel字节或数字作为字段ID,而不是文本名称

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

    考虑使用数据库
    请参见

    Boost不是一个库,它是库的集合。序列化只是其中之一;如果您使用C++03,可能有很多库可以使用。@ildjarn:从技术上讲,这可能是正确的,但在这种情况下,做出区分并不能改善任何效果。@Mehrdad:它可以提高OP(和其他读者)未来问题的清晰度。跳出框框思考。.-]@伊尔贾恩:我是——这就是为什么我说这个问题无关紧要@迈赫达德:这个背景!=这个问题。这个context==SO.SO例如:假设我想写一个book对象,称它为b,获取它的大小并将其写入文件,但是当读回时,如何区分成员?例如,有些是可预测的,因为它们是固定的,但有些是不固定的。或者你必须写下每个成员的大小?然后您就会知道,在重构对象之前,必须先读取n个成员(每个成员前面都有一个大小)。这似乎正确吗?如果你有一个具有可变长度字段的book对象,每个字段都会写入其大小,然后写入内容。使用数据库时,这是否涉及安装额外的软件以使程序正常工作?我对数据库所做的唯一工作就是使用PHP和mysql。在我看来,这是一个非常普遍的问题:创建某种类型的不可读文件格式。大多数程序是使用数据库还是编写序列化代码。这个主题通常不在C++的介绍书中,所以人们在哪里学习这些概念。对不起,有很多问题。问题是二进制数据依赖于平台。为了解决这个问题,许多协议(数据格式定义)都指定了变量的位宽度及其端点。接收平台上的程序(或读取数据的程序)可能需要执行额外的指令,以将协议转换为本机格式。只有文本表示才是真正可移植的。预算程序是使用数据库的好选择。如果您想了解数据库,并想构建自己的数据库,请继续。在不使用内存指针的情况下读取表、索引、B树和链接记录。