必须显式指定std::ios::binary标志,否则windows下会因0x1A被误判为EOF而截断数据;read()/write()需传原始内存地址和字节数,结构体需处理填充和字节序。

用 std::fstream 以 std::ios::binary 模式打开文件
默认的 std::fstream 是文本模式,会自动转换换行符(比如 rn → n),破坏二进制数据。必须显式指定 std::ios::binary 标志:
std::fstream file("data.bin", std::ios::in | std::ios::out | std::ios::binary); if (!file.is_open()) { // 处理失败 }
- 读写同开时,
std::ios::in | std::ios::out是必要组合;只读用std::ios::in,只写用std::ios::out - windows 下若漏掉
std::ios::binary,读到的字节数可能少于预期,尤其遇到0x1A(EOF 符)会被提前截断 - linux/macOS 对文本/二进制模式区分不敏感,但跨平台代码必须统一加
std::ios::binary
read() 和 write() 的参数与常见错误
这两个函数操作的是原始内存块,不是字符串或对象本身,参数必须严格匹配:
int value = 42; file.write(reinterpret_cast(&value), sizeof(value)); // 正确:取地址 + 强转 + 显式大小 char buf[1024]; file.read(buf, sizeof(buf)); // 正确:传入缓冲区首地址和字节数
-
read()不会自动在末尾加