C++ 二进制文件读写操作

发布时间:2026/10/31 19:22:23

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文件文件打开就是长下面这个样子哦
延伸阅读

更多相关文章

2026/10/30 23:55:07

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

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

2026/10/29 13:01:39

老视频画质太差?用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/10/31 19:19:41

国产CAD软件如何实现高效低成本设计

1. 国产CAD软件的市场现状与用户痛点在工程设计、建筑规划、机械制造等领域,CAD软件长期被国外品牌垄断。这种局面导致企业面临三大核心痛点:首先是高昂的授权费用,一套正版国外CAD软件动辄数万元,大型企业需要采购多套不同功能的…

2026/10/31 19:19:41

语音识别技术如何克服口音障碍:原理与实践

1. 项目背景与问题定义卡内基梅隆大学的研究团队最近破解了一个困扰全球语音技术领域多年的难题——为什么主流手机语音助手(如Siri、Alexa、Google Assistant等)在处理非母语口音的英语时表现糟糕。这个发现不仅解释了技术瓶颈的本质,更为改…

2026/10/31 19:19:41

2025届学术研究必备的六大AI工具推荐

1. 项目概述 "2025届必备的六大AI学术方案推荐"这个标题直指一个明确的需求场景:为即将进入学术研究领域的学生群体提供人工智能技术工具的选择指南。在当下AI技术快速迭代的背景下,学术研究者面临着工具选择的困境——既要考虑技术的前沿性&a…

2026/10/31 19:19:41

学术研究者的AI工具进化:提升效率与伦理的黄金组合

1. 2025届学术研究者的AI工具进化论当我在实验室通宵调试代码时,突然意识到:AI工具正在重塑学术研究的底层逻辑。2025届研究者面临的不仅是知识边界的拓展,更是研究范式的革命性转变。根据Nature最新调研,使用AI工具的科研团队论文…

2026/10/31 19:19:41

Python+Django实现高校宿舍管理系统开发指南

1. 项目背景与核心需求学生宿舍管理系统是高校信息化建设中的重要组成部分,也是计算机专业毕业设计的经典选题之一。传统的手工登记管理方式效率低下、容易出错,而一个完善的数字化管理系统能够显著提升宿舍分配、设备报修、访客登记等日常工作的效率。这…

2026/10/31 19:14:41

开源自动化工具链实战:从可试用流程到生产级落地

1. 从“工具收集”到“可试用流程”的思维转变做自动化这些年,我见过太多人掉进同一个坑:收藏夹里躺着上百个开源工具,GitHub Star 列表长得划不到底,可真到要落地一个自动化流程的时候,还是得从零开始搭。问题出在哪&…

2026/10/30 20:55:10

全国计算机二级C语言真题PDF高效刷题指南

简介:这份PDF是全国计算机二级C语言考试的试题与答案解析,专为备考二级C语言的考生准备。内容涵盖C语言特点与设计理念、程序基本组成单位、main函数执行流程、函数嵌套调用规则、标识符命名规范、整型实型字符型数据类型、八进制十六进制数合法形式、运…

2026/10/30 20:55:10

requests+BeautifulSoup:爬虫抓取h1标题的入门实战指南

简介:一份以实战为导向的Python爬虫入门资源,面向具备基本编程基础、希望快速掌握网络数据抓取的初学者,可解决从零编写简单爬虫的常见困惑。实例以requests库发送HTTP请求、BeautifulSoup解析HTML文档,完整演示从网页中提取 标题…

2026/10/30 20:55:09

递推最小二乘参数辨识MATLAB编程:二阶系统与渐消记忆实现

简介:这是一篇面向控制系统、信号处理与机器学习等领域学习者的最小二乘参数辨识程序说明文档。资源共包含一个docx格式文档,压缩包大小七十八KB,内容围绕递推最小二乘算法和渐消记忆最小二乘算法展开:先构造一个极点位于单位圆内…

2026/10/31 0:02:41

猫狗目标检测数据集:VOC/COCO/YOLO三格式一体化实战包

简介:本资源是一套面向计算机视觉初学者与YOLO目标检测实践者的猫狗图像数据集及配套开发工具包,专为快速上手目标检测模型训练而设计。资源包含1000张真实场景高清猫狗图片,标注质量高,同时提供VOC(XML)、…

2026/10/31 0:02:41

HDU2017多校标程复现:算法竞赛工程化真题沙盒

简介:本资源为2017年HDU多校联合训练第一场官方配套资料,面向ACM程序设计竞赛备赛学生、算法爱好者及高校编程集训队成员,旨在提供权威解题参考与完整测试验证环境。压缩包共40个文件,含15份C标程(覆盖全部赛题&#x…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑