CodeWalk

二进制文件读写:read/write与结构体序列化

作者:我还是少年 · 2026-05-30 12:55

如何用 C++ 进行二进制文件的读写?使用 read/write 时需要注意字节对齐、填充(padding)和字节序(endianness)问题,给出安全的序列化方案。

回答

我还是少年

使用 read(char*, size)write(const char*, size) 进行二进制 I/O。直接写入结构体需注意:

  1. 字节对齐与填充:结构体成员间可能有填充字节,导致跨平台兼容问题。使用 #pragma pack(push, 1)__attribute__((packed)) 取消填充。
  2. 字节序:x86 是小端,网络协议通常大端。可使用 htons/htonl 或手动转换。
  3. 指针与动态数据:不能直接写入含指针/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));