0

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

4

2 回答 2

3

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

如果它必须是二进制的,则必须从定义二进制格式开始:您希望如何表示文件中的每种类型。二进制并不意味着未格式化。除非有充分的理由不这样做,否则您可能会从已定义的格式开始,例如 XDR。然后你可能应该定义用于读取和写入这种格式的流类型——输入和输出函数std::istream 要么std::ostream使用文本格式,要么未格式化(这意味着你必须手动格式化或取消格式化你给它或从它接收的数据)。让这些类派生自std::basic_ios<char>, 然而; 它有很多多余的东西(例如格式化标志),但它会提供或多或少的标准错误报告机制。而且您可以(并且可能应该)使用标准streambuf,只需确保使用filebuf,文件以二进制模式打开,并且filebuf本身充满了"C"语言环境。

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

于 2013-09-13T10:36:12.177 回答
0

似乎你想要做的实际上是序列化。这样做的好库是Boost.SerializationProtocol Buffers

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

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

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

于 2013-09-13T14:35:40.210 回答