C++ 二进制文件读写操作
在 C 中处理二进制文件如图像、音频、序列化数据等与处理文本文件有本质区别。二进制读写要求数据在内存中的布局与文件中完全一致不进行任何字符编码转换或格式化。以下是关于std::ifstream::read和std::ofstream::write的详解涵盖核心用法、关键规则及常见陷阱。1. 核心前提以二进制模式打开文件这是最容易忽略的一步。如果使用默认的文本模式打开文件某些操作系统如 Windows会在遇到特定字节序列时进行转换例如将\n转换为 \r\n导致二进制数据损坏。‌必须显式指定ios::binary标志‌#include fstream #include iostream // 写二进制文件 std::ofstream outFile(data.bin, std::ios::binary); if (!outFile.is_open()) { std::cerr 无法打开文件用于写入 std::endl; return; } // 读二进制文件 std::ifstream inFile(data.bin, std::ios::binary); if (!inFile.is_open()) { std::cerr 无法打开文件用于读取 std::endl; return; }2. 函数原型与参数解析写入函数ostream::writeostream write(const char* s, std::streamsize n);‌s(缓冲区指针)‌指向要写入的数据起始地址。‌注意‌参数类型强制为const char*因此任何类型的指针都需要强转为char*。‌n(字节数)‌要写入的字节总数。通常使用sizeof(变量)或数组长度 * sizeof(元素类型)计算。读取函数istream::readistream read(char* s, std::streamsize n);‌s(缓冲区指针)‌指向存放读取数据的内存地址。同样需要强转为char*。‌n(字节数)‌期望读取的字节数。3. 实战示例场景一读写基本数据类型直接读写int,float,struct等 PODPlain Old Data类型。struct Player { int id; float health; char name; }; void binaryIOExample() { Player p1 {101, 95.5f, Hero}; // --- 写入 --- std::ofstream out(player.dat, std::ios::binary); if (out) { // 写法(char*)变量, sizeof(变量) out.write(reinterpret_castconst char*(p1), sizeof(Player)); out.close(); } // --- 读取 --- Player p2; std::ifstream in(player.dat, std::ios::binary); if (in) { // 写法(char*)变量, sizeof(变量) in.read(reinterpret_castchar*(p2), sizeof(Player)); // 检查是否成功读取了预期大小的数据 if (in.gcount() sizeof(Player)) { std::cout ID: p2.id , Health: p2.health std::endl; } else { std::cerr 读取数据不完整 std::endl; } in.close(); } }场景二读写数组/缓冲区如图像像素对于大型数据块一次性读写效率远高于循环逐字节读写。void arrayIOExample() { const int SIZE 1024; unsigned char buffer[SIZE]; // 初始化数据 for(int i0; iSIZE; i) buffer[i] static_castunsigned char(i % 256); // --- 写入整个数组 --- std::ofstream out(raw_data.bin, std::ios::binary); if (out) { // 数组名本身就是指针无需 但需强转 out.write(reinterpret_castconst char*(buffer), SIZE); out.close(); } // --- 读取整个数组 --- unsigned char readBuffer[SIZE]; std::ifstream in(raw_data.bin, std::ios::binary); if (in) { in.read(reinterpret_castchar*(readBuffer), SIZE); // 验证读取状态 if (in.fail()) { std::cerr 读取过程中发生错误 std::endl; } in.close(); } }4. 关键规则与最佳实践‌指针强转是必须的‌read和write的参数类型固定为char*或const char*。无论你的数据是int*、double*还是struct*都必须使用reinterpret_castchar*进行转换。推荐使用 C 风格的reinterpret_cast而非 C 风格的(char*)以提高代码可读性和安全性意识。‌严禁使用和运算符‌和是格式化 I/O 运算符它们会将数字转换为 ASCII 字符串例如整数123会被写成字符1,2,3并忽略空白符。这完全破坏了二进制数据的结构。‌二进制读写只能使用read()和write()。‌‌数据类型选择unsigned charvschar‌在处理原始字节流如图像像素、网络包时建议使用unsigned char。因为char在某些编译器下默认是有符号的-128 到 127可能导致位运算或数值比较出现意外行为。unsigned char保证范围是 0-255完美对应一个字节Byte。‌检查读取状态‌read不会自动在末尾添加\0也不会保证一定能读满请求的字节数例如文件剩余不足。使用in.gcount()获取实际读取的字节数。使用in.eof()检查是否到达文件尾。使用in.fail()或in.bad()检查是否发生严重错误。‌结构体对齐问题Padding‌如果直接读写struct需注意编译器可能会在成员之间插入填充字节Padding以满足内存对齐要求。风险不同编译器、不同平台32位 vs 64位的对齐方式可能不同导致生成的二进制文件不兼容。解决使用#pragma pack(1)强制紧凑排列非标准但广泛支持。或者手动序列化每个成员而不是直接读写整个结构体。‌对象包含指针时不能直接读写‌如果结构体或类中包含指针如std::string,std::vector,char*‌绝对不能‌直接使用write(obj, sizeof(obj))。原因sizeof只计算指针本身的大小4或8字节而不是指针指向的数据。写入的只是内存地址读取后该地址无效会导致崩溃。解决必须手动序列化指针指向的内容先写长度再写数据。5. 常见错误总结错误做法正确做法原因ifstream in(file.bin);ifstream in(file.bin, ios::binary);缺少二进制标志Windows下换行符会被转换。in variable;in.read((char*)variable, sizeof(variable));是文本格式化输入会破坏二进制结构。write(ptr, size)其中 ptr 未强转6写操作代码实战图解帮助初学者加强理解#includeiostream using namespace std; #includefstream class Person { public: char m_Name[64]; //姓名 int m_Age; //年龄 }; void test01(){ //1、包含头文件 //2.创建流对象 ofstream ofs(person.txt,ios::out | ios::binary); //3、打开文件 //ofs.open(person.txt,ios::out | ios::binary) ; //4、写文件 Person p { 张三,18 }; ofs.write((const char *)p, sizeof(Person)); //5、关闭文件 ofs.close(); } //二进制文件写文件 int main() { test01(); system(pause); return 0; }我们打开文件的路径发现多了一个person.txt文件文件打开就是长下面这个样子哦

相关新闻

如何快速掌握Web安全扫描:Arachni框架的完整入门指南

如何快速掌握Web安全扫描:Arachni框架的完整入门指南

如何快速掌握Web安全扫描:Arachni框架的完整入门指南 【免费下载链接】arachni Web Application Security Scanner Framework 项目地址: https://gitcode.com/gh_mirrors/ar/arachni Arachni是一款功能全面、模块化的高性能Ruby框架,专为帮助渗透…

2026/7/17 11:41:18阅读更多 →
ZenlessZoneZero-OneDragon:基于计算机视觉的游戏自动化架构设计与实践

ZenlessZoneZero-OneDragon:基于计算机视觉的游戏自动化架构设计与实践

ZenlessZoneZero-OneDragon:基于计算机视觉的游戏自动化架构设计与实践 【免费下载链接】ZenlessZoneZero-OneDragon 绝区零 一条龙 | 全自动 | 自动闪避 | 自动每日 | 自动空洞 | 支持手柄 项目地址: https://gitcode.com/gh_mirrors/ze/ZenlessZoneZero-OneDrag…

2026/7/17 11:41:18阅读更多 →
老视频画质太差?用Video2X让模糊画面瞬间变清晰

老视频画质太差?用Video2X让模糊画面瞬间变清晰

老视频画质太差?用Video2X让模糊画面瞬间变清晰 【免费下载链接】video2x A machine learning-based video super resolution and frame interpolation framework. Est. Hack the Valley II, 2018. 项目地址: https://gitcode.com/GitHub_Trending/vi/video2x …

2026/7/17 11:41:18阅读更多 →
如何通过Fast-GitHub实现GitHub下载加速的3个关键步骤

如何通过Fast-GitHub实现GitHub下载加速的3个关键步骤

如何通过Fast-GitHub实现GitHub下载加速的3个关键步骤 【免费下载链接】Fast-GitHub 国内Github下载很慢,用上了这个插件后,下载速度嗖嗖嗖的~! 项目地址: https://gitcode.com/gh_mirrors/fa/Fast-GitHub 如果你在使用GitHub时经常遇…

2026/7/17 12:51:54阅读更多 →
PyVideoTrans终极指南:3分钟免费实现视频AI翻译与智能配音

PyVideoTrans终极指南:3分钟免费实现视频AI翻译与智能配音

PyVideoTrans终极指南:3分钟免费实现视频AI翻译与智能配音 【免费下载链接】pyvideotrans Translate the video from one language to another and embed dubbing & subtitles. 项目地址: https://gitcode.com/gh_mirrors/py/pyvideotrans 你是否曾经面对…

2026/7/17 12:51:54阅读更多 →
3个理由告诉你:为什么每个Mac用户都应该试试Mousecape

3个理由告诉你:为什么每个Mac用户都应该试试Mousecape

3个理由告诉你:为什么每个Mac用户都应该试试Mousecape 【免费下载链接】Mousecape Cursor Manager for OSX 项目地址: https://gitcode.com/gh_mirrors/mo/Mousecape 你是否厌倦了macOS系统千篇一律的白色箭头光标?想要为你的苹果电脑注入一些个性…

2026/7/17 12:51:54阅读更多 →
EdgeRemover 3步彻底移除:Windows系统级Edge卸载深度解析与技术实现

EdgeRemover 3步彻底移除:Windows系统级Edge卸载深度解析与技术实现

EdgeRemover 3步彻底移除:Windows系统级Edge卸载深度解析与技术实现 【免费下载链接】EdgeRemover A PowerShell script that correctly uninstalls or reinstalls Microsoft Edge on Windows 10 & 11. 项目地址: https://gitcode.com/gh_mirrors/ed/EdgeRemo…

2026/7/17 12:51:54阅读更多 →
晶圆划片工艺:从划片线设计到切割质量优化

晶圆划片工艺:从划片线设计到切割质量优化

1. 晶圆制造中的划片工艺概述在半导体制造的最后阶段,我们需要将完成所有工艺步骤的整片晶圆分割成单个芯片,这个过程被称为"划片"或"晶圆切割"。划片工艺看似简单,实则直接影响芯片的良率和可靠性。想象一下&#xff0c…

2026/7/17 12:51:54阅读更多 →
w64devkit:为Windows平台构建的现代化C/C++开发工具链解决方案

w64devkit:为Windows平台构建的现代化C/C++开发工具链解决方案

w64devkit:为Windows平台构建的现代化C/C开发工具链解决方案 【免费下载链接】w64devkit Portable C and C Development Kit for x64 (and x86) Windows 项目地址: https://gitcode.com/gh_mirrors/w6/w64devkit w64devkit是一个专为Windows平台设计的便携式…

2026/7/17 12:46:52阅读更多 →
VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异

VSCode TypeScript 环境配置对比:全局安装 vs 项目本地安装的4个关键差异当你在VSCode中启动一个新的TypeScript项目时,第一个技术决策往往从安装方式开始。这个看似简单的选择——全局安装还是项目本地安装——实际上会深刻影响你的开发流程、团队协作和…

2026/7/17 10:42:55阅读更多 →
智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手

智慧树刷课插件:5分钟实现自动化学习的智能助手 【免费下载链接】zhihuishu 智慧树刷课插件,自动播放下一集、1.5倍速度、无声 项目地址: https://gitcode.com/gh_mirrors/zh/zhihuishu 智慧树刷课插件是一款专为智慧树在线教育平台设计的Chrome浏…

2026/7/17 8:31:03阅读更多 →
Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案

Steam创意工坊下载器WorkshopDL:跨平台游戏模组获取的终极解决方案 【免费下载链接】WorkshopDL WorkshopDL - The Best Steam Workshop Downloader 项目地址: https://gitcode.com/gh_mirrors/wo/WorkshopDL 你是否在GOG或Epic Games Store购买了心仪的游戏…

2026/7/16 12:02:41阅读更多 →
VS Code 高效配置与个性化定制全攻略

VS Code 高效配置与个性化定制全攻略

1. VS Code 高效配置基础作为一款轻量级但功能强大的代码编辑器,VS Code 的默认配置已经能满足基本需求,但通过合理调整设置可以大幅提升编码效率。我使用 VS Code 已经有五年多时间,期间尝试过各种配置方案,总结出这套适合大多数…

2026/7/17 0:00:01阅读更多 →
从竞赛代码到桌面工具:让 SuperADD 与 SubspaceAD 真正跑进自己的图像

从竞赛代码到桌面工具:让 SuperADD 与 SubspaceAD 真正跑进自己的图像

在异常检测领域,很多优秀算法最初都是以研究代码的形式发布的。它们能够在固定测试集上复现实验结果,却不一定能被普通用户直接拿来测试自己的图片。尤其是最近很多算法仅提供在固定测试集的测试环境,而gradio的demo演示也不会提供。 对工程应用和在自己的图片上进行测试来…

2026/7/17 0:00:01阅读更多 →
WinRAR高效配置指南:从基础安装到高级压缩实战

WinRAR高效配置指南:从基础安装到高级压缩实战

前几天帮同事处理一个客户发来的压缩包,解压时系统自带的工具弹出一串乱码,换用 WinRAR 却顺利打开了。这种看似简单的场景,恰恰暴露了不同压缩工具在处理非标准编码、分卷压缩或加密文件时的差异。WinRAR 作为一款老牌工具,真正价…

2026/7/17 0:00:01阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/16 20:13:14阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/16 8:58:42阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/16 17:10:26阅读更多 →