
用 ofstream 写 int 到文本文件,最直接但要注意格式
直接写 int 到 .txt 文件,本质是写它的十进制字符串表示,不是二进制字节。很多人误以为 ofstream 是“存原始值”,其实它调用的是格式化输出——比如 <code>42 会变成字符 '4' 和 '2',占两个字节。
- 适合人眼可读、后续用其他程序(如 Python、Excel)打开查看或解析
- 如果
int值很大(比如2147483647),写入后就是 10 个 ASCII 字符,不是 4 字节 - 默认用空格/换行分隔,读取时得按文本规则解析,不能直接
read()4 字节 - 注意 locale 影响:某些地区设置下,
std::cout可能插入千位分隔符(虽然ofstream默认不会,但显式设imbue后可能出问题)
std::ofstream f("data.txt");
int x = 123;
f << x << '\n'; // 写入 "123\n",不是二进制 0x7B 0x00 0x00 0x00
用 write() 存原始二进制 int,快但平台依赖强
想把 int 当作内存里的 4 字节原样存进去,就得绕过格式化,用 write()。这是真正“把 int 存入文件”的底层做法,但后果很实在:跨平台或跨编译器可能读不出来。
-
sizeof(int)不固定——Windows/Linux 上通常是 4,但嵌入式或老系统可能是 2 或 8 - 字节序(endianness)不统一:x86 是小端,ARM 某些模式是大端,直接读会得到错误数值
- 没有类型标记,文件里全是裸字节,你得自己记住“第 0–3 字节是第一个
int” - 调试时用
hexdump -C data.bin能看到 raw bytes,但用文本编辑器打开就是乱码
std::ofstream f("data.bin", std::ios::binary);
int x = 123;
f.write(reinterpret_cast<const char*>(&x), sizeof(x));
读取时必须和写入方式严格匹配,否则数据错乱
写文本就用 >> 读,写二进制就用 read() 读。混用等于主动丢数据——比如用 ifstream >> x 去读一个二进制文件,它会从第一个字节开始找数字字符,跳过所有非数字字节,结果完全不可控。
- 文本写入 → 文本读取:
f >> x;或std::stoi(line) - 二进制写入 → 二进制读取:
f.read(reinterpret_cast<char>(&x), sizeof(x));</char> - 如果写入用了
write()但读取忘了std::ios::binary标志,Windows 下遇到0x1A(EOF 字符)会提前终止 - 读二进制前务必检查
f.gcount() == sizeof(int),防止文件损坏或截断
别忽略文件打开模式和错误检查
看似只是开个文件,但漏掉关键标志或跳过状态检查,会让整个读写过程静默失败。
立即学习“C++免费学习笔记(深入)”;
- 写二进制文件必须加
std::ios::binary,否则 Windows 下换行符会被转成"\r\n",破坏原始字节 - 每次操作后查
f.fail()或用if (!f),别假设“开了就能写”——磁盘满、权限不足、路径不存在都会让write()看似成功实则没写入 - 用
std::ofstream f(...); if (!f) { /* 处理错误 */ }比事后才发现文件为空更可靠 - 关闭文件前最好调
f.flush(),尤其在调试时避免缓冲区未落盘导致误判
写文本还是写二进制,取决于你之后怎么用这个文件。人要看得懂、要跨语言处理,就选文本;追求极致性能、只在同环境 C++ 内部流转,才考虑二进制——而且得把字节序、大小、对齐这些细节钉死。









