c++怎么把std::vector以二进制形式快速存入磁盘【实战】

千晨酱_9684

千晨酱_9684

2026-03-28

509人浏览

原创

用std::ofstream二进制写vector最高效,需用binary模式、先写固定大小长度头(如uint64_t)、再写data()内存块,注意跨平台字节序与size_t兼容性。

c++怎么把std::vector<double>以二进制形式快速存入磁盘【实战】

用 std::ofstream 配合 write() 直接写内存块最省事

只要 vector 不含指针、虚函数或自定义析构逻辑(double 完全满足),它底层就是连续的 double 数组,可以直接按字节 dump。别转成字符串、JSON 或逐个写——那是自找慢。

实操建议:

  • 打开文件必须用 std::ios::binary 模式,否则 Windows 下换行符会被悄悄替换,读出来就错
  • 先写长度(size_t),再写数据,否则读取时不知道该读多少个 double
  • 用 data() 获取首地址,别用 &v[0] ——当 v.empty() 时前者安全,后者未定义行为
std::ofstream f("data.bin", std::ios::binary);
size_t n = v.size();
f.write(reinterpret_cast<const char>(&n), sizeof(n));
f.write(reinterpret_cast<const char>(v.data()), n * sizeof(double));</const></const>

读取时要注意 sizeof(size_t) 和字节序是否一致

写进去的长度是本机 size_t,如果文件要在不同平台(比如 x86_64 写、ARM32 读)间共享,size_t 大小可能不一致,直接读会崩。即使同架构,也要确认两端编译器对齐和大小一致。

常见错误现象:

  • 读出的 n 是巨大随机值(比如 140737488355328),后续 read() 超长失败,vector 分配巨量内存卡死
  • 读出来的 double 全是 nan 或极小值 —— 实际是字节序翻转了(比如大端写、小端读没处理)

简单对策:固定用 uint64_t 存长度,读写都用 htonll()/ntohll()(需自己实现或用 htobe64() 等),但若只在同环境读写,跳过也行。

别用 std::fstream::seekp() 在中间改写,除非你手动管理偏移

二进制文件不是数据库,没有“按索引更新第 5 个 double”这种原子操作。想改某几个值,常见误区是:

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 用 seekp(pos) 定位后直接 write() —— 如果 pos 计算错(比如忘了 sizeof(uint64_t) 的头长度),就会覆盖长度字段或相邻数据
  • 以为 vector 写完还能像数组一样“随机写”,结果发现文件末尾多了一堆 \x00(因为 seekp() 超出当前长度时,中间自动补零)

真实场景中,如需频繁修改,不如整块读入、改内存、再整块写出;真要追加,确保每次都在 eof 位置,并重新写长度头。

跨平台移植时,double 的二进制表示基本可靠,但得避开 NaN 的 payload 差异

IEEE 754 规定了 double 的布局,主流平台(x86、ARM、RISC-V)都遵守,所以直接 memcpy 字节通常能互通。唯一坑点是 NaN:标准允许任意 payload,GCC/Clang/MSVC 生成的 quiet NaN 可能 bit 位不同,但数值比较仍为 false,不影响计算逻辑。

如果你的业务依赖 NaN 的具体 bit 模式(比如用 payload 编码类型),那就不能裸写,得序列化成固定格式(如 uint64_t + 标志位)。

其他兼容性注意点:

  • 别依赖 std::numeric_limits<double>::is_iec559</double> 运行时检查 —— 它几乎总是 true,但查了也没用
  • 不用 long double,它的大小和布局在平台间差异太大(x86_64 是 80-bit 扩展精度,aarch64 通常是 64-bit)

二进制写 vector<double></double> 本身很简单,真正的复杂点藏在“谁来读”和“什么时候读”里——尤其是当文件要被 Python(np.fromfile())、MATLAB 或另一个 C++ 进程读取时,头结构、字节序、size_t 长度这些细节,漏一个就卡半天。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
fprintf在matlab中的用法
fprintf在matlab中的用法

fprintf是MATLAB中用于格式化输出的函数。fprintf的基本语法为“fprintf(fileID, format, A)”,其中,fileID是一个标识符,用于指定要写入的文件,如果要将数据写入到命令窗口中,则可以使用1作为fileID的值,format是一个字符串,用于指定输出的格式,A是要输出的数据。

2023.09.28

738

5

数据分析工具有哪些
数据分析工具有哪些

数据分析工具有Excel、SQL、Python、R、Tableau、Power BI、SAS、SPSS和MATLAB等。详细介绍:1、Excel,具有强大的计算和数据处理功能;2、SQL,可以进行数据查询、过滤、排序、聚合等操作;3、Python,拥有丰富的数据分析库;4、R,拥有丰富的统计分析库和图形库;5、Tableau,提供了直观易用的用户界面等等。

2023.10.12

4223

8

Matlab中length函数的用法
Matlab中length函数的用法

在Matlab中,length函数用于返回向量、数组或字符串中的元素个数。想了解更多length函数的相关内容,可以阅读本专题下面的文章。

2023.11.22

518

5

Matlab中axis函数用法
Matlab中axis函数用法

在Matlab中,axis函数用于控制坐标轴的范围和比例。想了解更多axis函数的相关内容,可以阅读本专题下面的文章。

2023.11.23

912

5

subplot在matlab中的用法
subplot在matlab中的用法

subplot在matlab中用于在同一个图窗中创建多个子图。通过指定子图的行数、列数和当前绘图位置,可以在每个子图中绘制不同的图形。想了解更多subplot在matlab中的用法,可以访问下面的文章。

2023.11.27

237

3

scilab和matlab的区别
scilab和matlab的区别

scilab和matlab的区别:1、注释符号;2、预设变量的表示;3、操作符的用法;4、矩阵的定义与调用;5、程序的编辑与执行;6、数据类型;7、函数库;8、图形界面;9、社区支持与生态系统;10、跨平台兼容性;11、价格。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.12.11

289

5

Matlab如何四舍五入
Matlab如何四舍五入

Matlab可以通过round函数和格式化输出函数来对数值来进行四舍五入操作。更多关于Matlab相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.12.12

1117

11

Matlab中axis函数用法介绍
Matlab中axis函数用法介绍

在Matlab中,axis函数用于设置当前坐标轴的范围和刻度。想了解更多axis函数的相关内容,可以阅读本专题下面的文章。

2023.12.13

283

6

matlab griddata函数用法
matlab griddata函数用法

matlab中函数用于在给定的(X,Y)坐标上插值相应的Z值,从而将一组三维数据(x,y,z)网格化。想了解更多matlab的相关内容,可以阅读本专题下面的文章。

2023.12.15

3232

9

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习