我正在用c ++创建一个银行系统。我创建了所有的功能,如存款,取款。不同的帐户类型:保存和当前。但是不知道如何将数据存储在二进制文件中。此外,我希望在一个会话中输入的数据必须存在,以便在另一个会话中使用。你能告诉我一些怎么做的事吗?
答案 0 :(得分:3)
第一:为何二进制?二进制文件通常不是一个好主意。
如果它必须是二进制的,你必须从定义开始
二进制格式:如何表示每种类型
文件。二进制文件不表示未格式化。除非有
这样做的理由很充分,你可以从一开始
已定义的格式,例如XDR。那你应该可能
定义用于读写的流类型
格式 - std::istream
中的输入和输出函数
和std::ostream
使用文本格式,或者未格式化
(这意味着您必须手动格式化或取消格式化数据
你给它或从它接收)。这可能是一个好主意
然而,这些类派生自std::basic_ios<char>
;
它有很多超级丰富的东西(例如格式化)
flags),但它会提供或多或少的标准错误
报告机制。你可以(也许应该)使用
标准streambuf
,只需使用filebuf
确保文件即可
以二进制模式打开,filebuf
本身就是充满了
使用"C"
区域设置。
或者,您可以格式化为std::vector<unsigned
char>
,并使用系统级函数进行写入。
事实上,您可能必须这样做,因为filebuf
无法制作
交易安全。如果这是一个真正的银行应用程序,
而不是课程工作,你将必须这样做,因为真实
银行应用程序确实需要事务完整性:您有
用特殊参数打开文件,以确保你
在数据物理上位于磁盘上之前不要从写入返回。
并且没有一个标准流支持这一点。
答案 1 :(得分:0)
似乎你要做的事情实际上是序列化。 执行此操作的好库是Boost.Serialization或Protocol Buffers。
Boost.Serialization是一个复杂的怪物,需要考虑很多注意事项,但对于你的简单情况,它应该相当容易。协议缓冲区需要从维护角度进行更多工作(您必须维护一个.proto文件,该文件描述了您正在保存的格式)。
我可以在这里详细介绍每个库的工作原理,但我建议您查看文档,看看哪一个最适合您。就个人而言,我过去经常使用Boost.Serialization,但由于所有警告我转移到Protocol Buffers(也是因为我用它在Java和C ++之间传输对象)。
使用这些库,您可以轻松地以二进制格式保存对象,而无需担心细节。稍后,您还可以轻松切换到XML或文本输出。