将客户数据存储到 c++ 中的二进制文件中
Store customer data into a binary file in c++
我正在用 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 或文本输出。
- 正在读取二进制文件(is_open)
- 在C++中将类(带有Vector成员)保存为二进制文件
- 如何从二进制文件中读取字符串
- 保存/加载大量短数组到二进制文件
- 从二进制文件中读取整数数组
- Android 在编译二进制文件时重建静态库
- 在 C++ 中将双精度变量写入二进制文件
- clang 的 libFuzzer 可以在同一二进制文件中测试超过 1 个 API 吗?
- C++:实际上不是从二进制文件中读取
- 如何从二进制文件中的给定符号中获取调用程序图
- 将内部带有矢量的结构保存/读取到二进制文件中
- 编译多个C++文件.调用二进制文件以运行代码
- 如何使用位字段将数据从二进制文件复制到结构中?
- uint8_t同一二进制文件的不同十进制值
- C++单个生成文件多个二进制文件
- 尝试将数字写入二进制文件时引发异常
- C++中读/写二进制文件
- 如何忽略某些二进制文件的执行?
- 对在不同二进制文件中创建的对象文件的依赖关系
- 我的 SDL2 程序需要哪些二进制文件,以便它在另一台未安装 SDL2 的计算机中工作