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

Store customer data into a binary file in c++

本文关键字:二进制文件 c++ 客户 数据 存储      更新时间:2023-10-16

我正在用 c++ 创建一个银行系统。我已经创建了所有功能,如存款,取款。不同的账户类型:储蓄和流动账户。但不知道如何将数据存储在二进制文件中。我还希望在一个会话中输入的数据必须存在才能在另一个会话中使用。你能建议我一些怎么做吗?

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

如果它必须是二进制的,则必须从定义开始二进制格式:您希望如何表示每种类型在文件。 二进制并不意味着未格式化。 除非有否则,您可能会从已定义的格式,例如 XDR。 那么你可能应该定义用于读取和写入此内容的流类型格式 - std::istream 中的输入和输出函数并且std::ostream使用文本格式或未格式化(这意味着您必须手动格式化或取消格式化数据你给予它或从中接收)。 这可能是个好主意然而,这些类派生自std::basic_ios<char>;它有很多多余的东西(例如格式标志),但它会提供或多或少的标准错误报告机制。 您可以(并且可能应该)使用标准streambuf,只要保证用filebuf,文件以二进制模式打开,并且filebuf本身被灌输使用"C"区域设置。

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

似乎您要做的实际上是序列化。执行此操作的好库是 Boost.Serialization 或 Protocol Buffers。

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

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

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