讲师中心 微信公众号
AI工具推荐 视频效率加速

C++如何读写二进制文件 _ fstream write与read函数用法【实战】

夏枫酱_2775

夏枫酱_2775

发布时间:2026-04-07 23:11:34

|

500人浏览过

|

来源于php中文网

原创

最稳妥的二进制文件读写方式是用 std::ofstream 和 std::ifstream 配合 write()/read(),需显式加 std::ios::binary 标志、避免格式化 I/O、注意字节对齐、固定类型、手动处理字节序与缓冲。

c++如何读写二进制文件 _ fstream write与read函数用法【实战】

直接说结论:用 std::ofstream 和 std::ifstream 配合 write() / read() 是最稳妥的二进制文件读写方式,但必须关掉文本模式、注意字节对齐、避免直接读写含指针或虚函数的类。

为什么不能用 operator<< 和 operator>> 写二进制文件

这两个操作符默认走格式化 I/O,会把 int 转成 ASCII 字符串(比如 123 写成三个字节 '1''2''3'),还会跳过空白、自动换行转换(Windows 的 \r\n → \n)。二进制文件要的是原样字节拷贝,一丁点都不能变。

常见错误现象:
• 文件大小远大于预期(因为数字被转成多字节字符串)
• 在另一台机器或另一编译器下读出来全是 0 或乱码
• 读取结构体时字段值错位

实操建议:
• 所有二进制流必须显式加 std::ios::binary 标志
• 用 write() 和 read(),别碰 <</>>
• 检查 write() 返回值或用 good() 判断是否写满

立即学习“C++免费学习笔记(深入)”;

write() 和 read() 的参数陷阱

这两个函数签名一致:stream.write(char* s, std::streamsize n),第一个参数必须是 char* 类型,第二个是**字节数**,不是元素个数。

常见错误现象:
• 写 std::vector<int> v(100); write(v.data(), 100) —— 只写了前 100 字节,不是 100 个 int(通常只写 25 个)
• 把 std::string 的 c_str() 直接传给 write() —— 遇到 \0 就截断,且不包含长度信息
• 对 class 对象直接 write(&obj, sizeof(obj)) —— 若含 std::string、std::vector 或虚表指针,读出来就是野指针

实操建议:
• 写数组:用 reinterpret_cast<char*>(&arr[0]) + sizeof(T) * count
• 写 POD 结构体:确保它不含 STL 容器、指针、虚函数;可用 static_assert(std::is_trivially_copyable_v<MyStruct>) 编译期检查
• 写 string 内容:先写长度(如 uint32_t len = s.size(); out.write(reinterpret_cast<char*>(&len), sizeof(len))),再写 s.data()

C++14
C++14

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

下载

跨平台读写结构体时的对齐与大小问题

不同编译器、不同平台对 struct 的内存布局可能不同。比如 struct { char a; int b; } 在 x86_64 上通常是 8 字节(因 int 对齐到 4 字节边界),但若目标平台要求 2 字节对齐,读出来就全错。

常见错误现象:
• 同一结构体在 Linux 编译写的文件,Windows 下读出字段偏移全乱
• sizeof(MyStruct) 在两个环境里不一样
• 读出来的数值是极大正数或负数(高位字节被错当成符号位)

实操建议:
• 用 #pragma pack(1) 强制 1 字节对齐(写在 struct 前后)
• 用固定宽度类型:把 int 换成 int32_t,short 换成 int16_t
• 不依赖 sizeof 自动计算,手写序列化函数,逐字段 write()
• 读之前先校验魔数(magic number)和版本号,避免静默错读

关闭缓冲或强制刷盘的时机

二进制写入常用于日志、快照、临时缓存等场景,如果程序崩溃前没刷盘,数据就丢了。默认情况下 ofstream 是带缓冲的,close() 才真正落盘。

常见错误现象:
• 程序异常退出后,文件为空或只有部分数据
• 多线程写同一文件时出现内容重叠或覆盖
• 用 write() 写完立刻用另一个进程读,读不到最新内容

实操建议:
• 关键数据写完调 out.flush(),或设 std::ios::unitbuf 标志(每条 write() 后自动 flush,性能略降)
• 避免多线程共用一个 fstream 对象;如需并发,用文件锁(flock())或分文件写
• 重要文件写完先 close(),再 fsync()(POSIX)或 FlushFileBuffers()(Windows)

最易被忽略的一点:二进制读写从不关心“字符编码”,但非常在意**字节序(endianness)**。如果你的程序要跑在 ARM(小端)和 PowerPC(大端)上,或者和 Java/Go 服务交换数据,必须统一约定网络字节序(大端),并手动用 htons()/htonl() 转换整数。

热门AI工具

更多
二狗PPT
二狗PPT Hot

一款AI演示文稿工具,主要用于专为中式职场打造的AI PPT生成工具,适合需要提升相关任务效率的用户。

超级简历WonderCV

一款AI办公效率工具,主要用于免费求职简历模版下载制作,应届生职场人必备简历制作神器,适合需要提升相关任务效率的用户。

Loomy
Loomy Hot

一款AI工具,主要用于科大讯飞发布的桌面级 AI 助理,比 OpenClaw 更易用、更安全!,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

火山引擎

火山引擎是一款面向企业的云计算与AI服务平台。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

6519

2023.08.02

counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

3248

2023.11.20

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

1758

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

2764

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

6104

2023.10.24

字符串介绍
字符串介绍

字符串是一种数据类型,它可以是任何文本,包括字母、数字、符号等。字符串可以由不同的字符组成,例如空格、标点符号、数字等。在编程中,字符串通常用引号括起来,如单引号、双引号或反引号。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

5789

2023.11.24

java读取文件转成字符串的方法
java读取文件转成字符串的方法

Java8引入了新的文件I/O API,使用java.nio.file.Files类读取文件内容更加方便。对于较旧版本的Java,可以使用java.io.FileReader和java.io.BufferedReader来读取文件。在这些方法中,你需要将文件路径替换为你的实际文件路径,并且可能需要处理可能的IOException异常。想了解更多java的相关内容,可以阅读本专题下面的文章。

7414

2024.03.22

php中定义字符串的方式
php中定义字符串的方式

php中定义字符串的方式:单引号;双引号;heredoc语法等等。想了解更多字符串的相关内容,可以阅读本专题下面的文章。

10934

2024.04.29

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

0

2026.10.22

热门下载

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

精品课程

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

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

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

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn