将客户数据存储在c ++中的二进制文件中

时间:2013-09-13 10:14:43

标签: c++ file-handling

我正在用c ++创建一个银行系统。我创建了所有的功能,如存款,取款。不同的帐户类型:保存和当前。但是不知道如何将数据存储在二进制文件中。此外,我希望在一个会话中输入的数据必须存在,以便在另一个会话中使用。你能告诉我一些怎么做的事吗?

2 个答案:

答案 0 :(得分:3)

第一:为何二进制?二进制文件通常不是一个好主意。

如果它必须是二进制的,你必须从定义开始 二进制格式:如何表示每种类型 文件。二进制文件表示未格式化。除非有 这样做的理由很充分,你可以从一开始 已定义的格式,例如XDR。那你应该可能 定义用于读写的流类型 格式 - std::istream中的输入和输出函数 和std::ostream使用文本格式,或者未格式化 (这意味着您必须手动格式化或取消格式化数据 你给它或从它接收)。这可能是一个好主意 然而,这些类派生自std::basic_ios<char>; 它有很多超级丰富的东西(例如格式化) flags),但它会提供或多或少的标准错误 报告机制。你可以(也许应该)使用 标准streambuf,只需使用filebuf确保文件即可 以二进制模式打开,filebuf本身就是充满了 使用"C"区域设置。

或者,您可以格式化为std::vector<unsigned char>,并使用系统级函数进行写入。 事实上,您可能必须这样做,因为filebuf无法制作 交易安全。如果这是一个真正的银行应用程序, 而不是课程工作,你必须这样做,因为真实 银行应用程序确实需要事务完整性:您有 用特殊参数打开文件,以确保你 在数据物理上位于磁盘上之前不要从写入返回。 并且没有一个标准流支持这一点。

答案 1 :(得分:0)

似乎你要做的事情实际上是序列化。 执行此操作的好库是Boost.SerializationProtocol Buffers

Boost.Serialization是一个复杂的怪物,需要考虑很多注意事项,但对于你的简单情况,它应该相当容易。协议缓冲区需要从维护角度进行更多工作(您必须维护一个.proto文件,该文件描述了您正在保存的格式)。

我可以在这里详细介绍每个库的工作原理,但我建议您查看文档,看看哪一个最适合您。就个人而言,我过去经常使用Boost.Serialization,但由于所有警告我转移到Protocol Buffers(也是因为我用它在Java和C ++之间传输对象)。

使用这些库,您可以轻松地以二进制格式保存对象,而无需担心细节。稍后,您还可以轻松切换到XML或文本输出。