最直接方法是用std::ofstream::write()二进制写入,需转const char*并传总字节数,必须加std::ios::binary标志;注意数组大小计算、结构体对齐、pod限制及写入后错误检查。

用 std::ofstream 二进制写入原始数组最直接
想把 int arr[10] 或 float data[100] 原封不动存到磁盘,别用文本方式逐个输出——会丢失精度、大小不固定、读取时还得解析。直接走二进制流,效率高也保真。
关键点:std::ofstream::write() 接收的是 const char* 和字节数,所以得把数组首地址转成 char*,再乘以元素大小和数量:
int arr[5] = {1, 2, 3, 4, 5};
std::ofstream ofs("data.bin", std::ios::binary);
ofs.write(reinterpret_cast<const char>(arr), sizeof(arr));
ofs.close();</const>
- 必须加
std::ios::binary标志,否则 Windows 下换行符会被悄悄替换 -
sizeof(arr)只对栈上数组有效;若传入函数变成指针,就得额外传长度 - 浮点数组同理,
sizeof(float) * n算总字节数,别漏乘
写结构体数组要注意内存对齐和可移植性
如果数组元素是自定义 struct,比如 struct Point { int x, y; float z; },直接 write() 能用,但有隐患:
- 不同编译器或平台可能插入填充字节(padding),导致文件在另一台机器上读出来错位
- 结构体含指针、虚函数表、
std::string等非 POD 类型时,write()会把指针值写进去,毫无意义 - 跨平台传输前,建议用
#pragma pack(1)强制紧凑排列,或手动序列化每个字段
安全做法是只对纯数据结构(POD)且确认对齐一致时才二进制直写。
文本格式写入适合调试和跨语言读取
如果目标是让人看、或后续用 Python/JavaScript 读,就别二进制。用空格或换行分隔,更稳妥:
int arr[3] = {10, 20, 30};
std::ofstream ofs("data.txt");
for (int i = 0; i
- 注意
默认用十进制,浮点数可能被截断(如 <code>3.1415926输出成3.14159),需要std::setprecision控制 - 写入后文件末尾多一个换行不影响大多数解析器,但某些嵌入式脚本可能敏感
- 大数组文本写入明显比二进制慢,IO 和格式化开销都高
写入失败时 failbit 和 badbit 必须检查
文件路径不存在、磁盘满、权限不足时,write() 不抛异常,而是置位流状态。不检查就以为写成功了,后面读出来全是零或乱码:
- 写完立即调用
ofs.fail()或!ofs判断是否出错 -
failbit表示格式错误(比如文本模式下写二进制),badbit表示底层 IO 失败(如磁盘故障) - 推荐写法:
if (!ofs.write(...)) { /* 处理错误 */ }
尤其在嵌入式或服务端长期运行场景中,磁盘空间耗尽很常见,忽略这个检查会导致静默数据丢失。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











