二进制文件读写:read/write与结构体序列化
如何用 C++ 进行二进制文件的读写?使用 read/write 时需要注意字节对齐、填充(padding)和字节序(endianness)问题,给出安全的序列化方案。
回答
我还是少年
使用 read(char*, size) 和 write(const char*, size) 进行二进制 I/O。直接写入结构体需注意:
- 字节对齐与填充:结构体成员间可能有填充字节,导致跨平台兼容问题。使用
#pragma pack(push, 1)或__attribute__((packed))取消填充。 - 字节序:x86 是小端,网络协议通常大端。可使用
htons/htonl或手动转换。 - 指针与动态数据:不能直接写入含指针/vector/string 的结构体,需要自定义序列化(如先写长度再写数据)。
建议:使用 Protocol Buffers、FlatBuffers、BSON 等成熟序列化库,或使用 std::span/std::bit_cast(C++20)辅助。
struct __attribute__((packed)) Record {
uint32_t id;
char name[32];
float score;
};
ofstream fout("data.bin", ios::binary);
Record r{1, "Alice", 95.5f};
fout.write(reinterpret_cast<const char*>(&r), sizeof(r));