用 std::ifstream 二进制读文件必须加 std::ios::binary,否则 windows 下会错误转换 rn;需检查 is_open()、用 seekg/tellg 获取大小、read() 后必查 gcount()、close() 后检查 fail()。

用 std::ifstream 以二进制模式打开文件必须加 std::ios::binary
不加这个标志,windows 下会把 rn 自动转成 n,读出来的字节数和文件实际大小对不上,尤其读图片、音频、加密数据时直接出错。linux/macOS 虽然影响小,但跨平台代码必须统一加。
常见错误:只写 std::ifstream file("data.bin") —— 这是文本模式,默认启用换行符转换。
- 正确写法:
std::ifstream file("data.bin", std::ios::binary) - 打开后务必检查:
if (!file.is_open()) { /* 处理失败 */ } - 如果路径含中文或特殊字符,c++ 标准库在 Windows 上默认不支持宽字符路径,建议用 UTF-8 编码路径 + 编译器扩展(如 MSVC 的
/utf-8)或改用std::Filesystem::u8path(C++17)
读取全部内容到内存推荐用 std::vector + read
std::ifstream::read() 是最可控的二进制读取方式,它不解析内容、不跳过空白、不添加终止符,完全按字节搬运。配合 std::vector 可避免手动 new[]/delete[] 和缓冲区溢出风险。
别用 getline() 或 >> 操作符——它们是为文本设计的,遇到