使用二进制模式可将POD结构体直接写入文件。定义不含指针的结构体如struct Student,用std::ofstream配合write()和reinterpret_cast写入数据,sizeof确定大小;读取时用std::ifstream和read()恢复内容,注意检查流状态并确保跨平台兼容性;多结构体则循环操作。

在C++中,将结构体写入二进制文件是一个常见的需求,比如保存程序状态、配置信息或游戏数据。实现这一功能的关键是使用文件流的二进制模式,并直接操作内存中的结构体数据。
定义结构体并确保内存布局清晰
为了正确写入和读取结构体,首先要定义一个简单的结构体。注意避免包含指针或动态分配的成员(如std::string),因为这些成员不会按预期写入文件。
struct Student {int id;
char name[50];
float score;
};
这个结构体是“POD”类型(Plain Old Data),适合直接进行二进制读写。如果使用std::string,需要序列化处理,否则会导致未定义行为。
将结构体写入二进制文件
使用std::ofstream以二进制模式打开文件,然后调用write()方法写入结构体内容。
立即学习“C++免费学习笔记(深入)”;
#includeStudent s{1, "Alice", 95.5f};
std::ofstream out("data.bin", std::ios::binary);
if (out) {
out.write(reinterpret_cast
out.close();
}
说明:
-
std::ios::binary确保以二进制方式写入,避免文本转换。 -
reinterpret_cast将结构体地址转为const char*,这是write()要求的类型。 -
sizeof(s)提供要写入的字节数。
从二进制文件读取结构体
使用std::ifstream以二进制模式读取文件,再用read()恢复结构体数据。
std::ifstream in("data.bin", std::ios::binary);
if (in) {
in.read(reinterpret_cast
if (in) {
// 读取成功
std::cout
}
in.close();
}
注意:
- 读取后应检查流状态(
if(in))确认是否成功。 - 跨平台时需注意字节序(endianness)和内存对齐问题。
- 结构体在不同编译环境下大小必须一致,否则读取出错。
写入多个结构体(数组或容器)
若要保存多个结构体,可循环写入:
std::vectorstd::ofstream out("students.bin", std::ios::binary);
for (const auto& s : students) {
out.write(reinterpret_cast
}
out.close();
读取时同样循环调用read(),直到文件结束。
基本上就这些。只要结构体是简单数据类型,二进制读写就很直接。关键是记得用binary模式,正确转换指针,检查IO状态。不复杂但容易忽略细节。











