Bootstrap

C++中使用ofstream和ifstream来读写二进制文件

C++中使用ofstream和ifstream来读写二进制文件

写入二进制文件的流程与前面介绍的流程差别不大,重要的是在打开文件时使用 ios_base::binary
标志。通常使用 ofstream::write 和 ifstream::read 来读写二进制文件,如程序清单 27.10 所示。

程序清单 27.10 将一个结构写入二进制文件并使用该文件的内容创建一个结构

0: #include<fstream>
1: #include<iomanip>
2: #include<string>
3: #include<iostream>
4: using namespace std;
5:
6: struct Human
7: {
8: Human() {};
9: Human(const char* inName, int inAge, const char* inDOB) : age(inAge)
10: {
11: strcpy(name, inName);
12: strcpy(DOB, inDOB);
13: }
14:
15: char name[30];
16: int age;
17: char DOB[20];
18: };
19:
20: int main()
21: {
22: Human Input("Siddhartha Rao", 101, "May 1916");
23:
24: ofstream fsOut ("MyBinary.bin", ios_base::out | ios_base::binary);
25:
26: if (fsOut.is_open())
27: {
28: cout << "Writing one object of Human to a binary file" << endl;
29: fsOut.write(reinterpret_cast<const char*>(&Input), sizeof(Input));
30: fsOut.close();
31: }
32:
33: ifstream fsIn ("MyBinary.bin", ios_base::in | ios_base::binary);
34:
35: if(fsIn.is_open())
36: {
37: Human somePerson;
38: fsIn.read((char*)&somePerson, sizeof(somePerson));
39:
40: cout << "Reading information from binary file: " << endl;
41: cout << "Name = " << somePerson.name << endl;
42: cout << "Age = " << somePerson.age << endl;
43: cout << "Date of Birth = " << somePerson.DOB << endl;
44: }
45:
46: return 0;
47: }

输出:
Writing one object of Human to a binary file
Reading information from binary file:
Name = Siddhartha Rao
Age = 101
Date of Birth = May 1916
分析:
第 22~31 行创建了结构 Human 的一个实例(该结构包含属性 name、age 和 BOD), 并使用 ofstream
将其持久化到磁盘中的二进制文件 MyBinary.bin 中。接下来,第 33~34 行使用另一个类型为 ifstream
的流对象读取这些信息。输出的 name 等属性是从二进制文件中读取的。该示例还演示了如何使用
ifstream::read 和 ofstream::write 来读写文件。注意到第 29 行使用了 reinterpret_cast,它让编译器将结构
解释为 char*。第 38 行使用 C 风格类型转换方式,这与第 29 行的类型转换方式等价。

如果不是出于解释的目的,我将把结构Human及其属性持久化到一个XML文件中。XML
是一种基于文本和标记的存储格式,在持久化信息方面提供了灵活性和可扩展性。
发布这个程序后, 如果您对其进行升级, 给结构 Human 添加了新属性(如 numChildren),
则需要考虑新版本使用的 ifstream::read,确保它能够正确地读取旧版本创建的二进制
数据。
;