在C++开发中,二进制文件操作是非常实用的技能,它可以直接以字节为单位处理数据,避免了文本文件转换带来的性能损耗和格式偏差,适合存储结构体、数组等结构化数据。

二进制文件打开模式
操作二进制文件需要使用fstream或者ifstream、ofstream类,打开文件时需要指定二进制模式,对应的标识是ios::binary,常见的打开模式组合如下:
ios::out | ios::binary:以二进制写模式打开文件,若文件不存在则创建,存在则清空内容ios::in | ios::binary:以二进制读模式打开文件,若文件不存在则打开失败ios::out | ios::in | ios::binary:以二进制读写模式打开文件,可同时进行读写操作
二进制文件写入操作
写入二进制数据需要使用write方法,该方法的第一个参数是待写入数据的指针,需要转换为const char*类型,第二个参数是写入的字节数。
基础数据类型写入示例
以写入一个整数和一个双精度浮点数为例:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
// 以二进制写模式打开文件
ofstream outFile("test.bin", ios::out | ios::binary);
if (!outFile.is_open()) {
cout << "文件打开失败" << endl;
return 1;
}
int num = 100;
double score = 95.5;
// 写入整数,sizeof(num)获取字节数
outFile.write(reinterpret_cast<const char*>(&num), sizeof(num));
// 写入浮点数
outFile.write(reinterpret_cast<const char*>(&score), sizeof(score));
// 关闭文件
outFile.close();
cout << "数据写入完成" << endl;
return 0;
}
自定义结构体写入示例
写入结构体时需要注意结构体是否存在内存对齐问题,若没有特殊对齐设置,可以直接写入整个结构体的字节:
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;
// 定义学生结构体
struct Student {
int id;
char name[20];
double grade;
};
int main() {
ofstream outFile("student.bin", ios::out | ios::binary);
if (!outFile.is_open()) {
cout << "文件打开失败" << endl;
return 1;
}
Student stu;
stu.id = 1;
strcpy(stu.name, "张三");
stu.grade = 88.5;
// 写入整个结构体
outFile.write(reinterpret_cast<const char*>(&stu), sizeof(Student));
outFile.close();
cout << "结构体数据写入完成" << endl;
return 0;
}
二进制文件读取操作
读取二进制数据需要使用read方法,第一个参数是接收数据的指针,同样需要转换为char*类型,第二个参数是读取的字节数。
基础数据类型读取示例
读取之前写入的整数和浮点数:
#include <iostream>
#include <fstream>
using namespace std;
int main() {
// 以二进制读模式打开文件
ifstream inFile("test.bin", ios::in | ios::binary);
if (!inFile.is_open()) {
cout << "文件打开失败" << endl;
return 1;
}
int num;
double score;
// 读取整数
inFile.read(reinterpret_cast<char*>(&num), sizeof(num));
// 读取浮点数
inFile.read(reinterpret_cast<char*>(&score), sizeof(score));
cout << "读取的整数:" << num << endl;
cout << "读取的浮点数:" << score << endl;
inFile.close();
return 0;
}
结构体数据读取示例
读取之前写入的学生结构体数据:
#include <iostream>
#include <fstream>
using namespace std;
struct Student {
int id;
char name[20];
double grade;
};
int main() {
ifstream inFile("student.bin", ios::in | ios::binary);
if (!inFile.is_open()) {
cout << "文件打开失败" << endl;
return 1;
}
Student stu;
inFile.read(reinterpret_cast<char*>(&stu), sizeof(Student));
cout << "学生ID:" << stu.id << endl;
cout << "学生姓名:" << stu.name << endl;
cout << "学生成绩:" << stu.grade << endl;
inFile.close();
return 0;
}
注意事项
- 二进制文件读写时不需要进行数据格式转换,所以不同平台之间的二进制文件可能存在兼容性问题,比如大端小端字节序差异、结构体内存对齐差异等
- 写入字符串时,不建议直接写入
string对象,因为string对象内部包含指针,写入的只是指针地址而非字符串内容,应该写入string的c_str()对应的字符数组,或者固定长度的字符数组 - 操作完文件后要及时调用
close方法关闭文件,避免数据没有及时写入磁盘导致丢失 - 读写前需要检查文件是否成功打开,避免出现空指针操作导致的程序崩溃
二进制文件操作的核心是明确数据的字节长度,只要保证写入和读取的字节数、数据类型一致,就能正确完成数据的存取。