直接用 fread 读二进制到结构体可行但有陷阱:仅限标准布局POD结构体,需对齐控制、大小端一致、无非POD成员;含 std::string 等须手动序列化,版本变更需校验兼容性。
直接用 fread 读二进制到结构体可行,但有陷阱
可以,但前提是结构体满足「标准布局(standard layout)」且无虚函数、无非POD成员、无访问控制差异。否则 fread 会把内存布局和实际字节对不上,读出来是错的或崩溃。
常见翻车点:
-
#pragma pack(1)没加,导致编译器按默认对齐(比如 4 或 8 字节),而文件里是紧凑排列 - 结构体含
std::string、std::vector等非 POD 成员——它们内部是指针,fread只拷贝指针值,不是数据 - 跨平台读写时,大小端不一致(比如 x86 小端写入,ARM 大端读取)
如何安全地把结构体写入/读出二进制文件
只对纯 POD 结构体操作,且显式控制内存布局:
struct alignas(1) Header {
uint32_t magic;
uint16_t version;
uint8_t flags;
};
写入时用 fwrite,读取时用 fread,并校验返回值:
立即学习“C++免费学习笔记(深入)”;