文件读写全套易错笔记

发布时间:2026/9/10 14:25:59

文件读写全套易错笔记 一、语法类错误错误代码修正代码错误1fopen不做空指针判断错误代码FILE*fpfopen(test.txt,r);fputc(a,fp);// 打开失败fpNULL直接崩溃问题文件打开失败不会捕获后续读写直接程序崩溃。修正代码FILE*fpfopen(test.txt,r);if(fpNULL){perror(文件打开失败);return1;}fputc(a,fp);错误2绝对路径、转义符、路径格式错误错误代码// 问题1单斜杠\是转义字符识别失败FILE*fpfopen(C:\Users\test.txt,rb);// 问题2绝对路径绑定本机换电脑直接找不到文件FILE*fpfopen(D:/user/123/b.txt,rb);推荐写法// 双反斜杠转义绝对路径FILE*fpfopen(C:\\Users\\test.txt,rb);// 最优文件放exe同目录使用相对路径FILE*fpfopen(test.txt,rb);错误3打开模式和读写操作不匹配错误代码FILE*fpfopen(data.txt,r);fputs(123,fp);// r只读模式执行写入运行失败要点r/rb仅可读w/wb/a/ab仅可写模式和操作必须对应。二、中文乱码问题文本文件乱码现象写入中文记事本打开乱码。原因VS默认编码GBK记事本默认UTF‑8解析字节编码不匹配。解决记事本另存为编码选择ANSI统一全部代码、文件编码为UTF‑8测试优先使用ASCII英文数字。二进制文件损坏乱码原因文本模式会自动转换\n与\r\n破坏二进制字节。解决图片、视频、压缩包读写必须加b使用rb/wb/ab。三、三大写入函数返回值区分核心易混点1. fputc单个字符写入原型int fputc(int ch, FILE* fp);成功返回字符ASCII十进制值如a返回97。失败返回EOF(-1)。intretfputc(a,fp);printf(%d,ret);// 输出972. fputs字符串写入原型int fputs(const char* str, FILE* fp);成功固定返回0。失败返回EOF(-1)。注意返回值为状态码禁止用%c打印。intretfputs(hello,fp);printf(%d,ret);// 成功输出03. fwrite二进制块批量写入原型size_t fwrite(const void* buf, size_t 块大小, size_t 块数量, FILE* fp);返回值实际成功写入的完整块个数不是字节数。判断失败返回值 传入块总数。总字节 返回值 × 单个块大小。返回值是无符号数禁止用%c打印。4. fread二进制读取原型size_t fread(void* buf, size_t 块大小, size_t 块数量, FILE* fp);返回值读到的完整块个数读取完毕返回0不能用EOF判断结束。返回值汇总表函数成功返回值失败/结束判断可用%c打印fputc字符ASCII码97ret EOF✅可以fputs固定0ret EOF❌不建议fwrite成功写入的块数量返回值预期块数❌禁止fread读到的块数量返回值 0❌禁止fread‑fwrite拷贝易错点货车模型通俗解析变量类比arr相当于货车车厢1024是车厢最大容量n记录本趟实际装载字节数。fread(缓冲区, 单块大小, 最多读多少块, 源文件)‑ arr货车车厢‑ 11块1字节‑ 1024一趟最多拉1024字节‑ file1源文件循环执行流程fread读取数据存入缓冲区实际读到字节数赋值给nn ! 0有数据就拷贝n0代表文件读完循环结束。fwrite(arr,1,n,file2)‑ n只写入本次读到的数据若固定写1024缓冲区残留垃圾数据文件末尾乱码。完整运行流程二进制模式打开源文件file1(rb)、目标文件file2(wb)缓冲区单次读取1024字节读满就写1024字节末尾不足就只写n字节fread返回0文件读取完毕退出循环关闭文件拷贝完成。易错点fwrite第三个参数必须填n不能写1024二进制文件必须使用rb/wb缓冲区大小可改为4096、8192缓冲区越大拷贝速度越快n规范类型为size_t无符号类型int可运行但不规范。错误缓冲区写法// 错误最后一次写入垃圾数据while(1){fread(arr,1,1024,file1);fwrite(arr,1,1024,file2);}正确模板charbuf[1024];size_tn;while((nfread(buf,1,1024,file1))!0){fwrite(buf,1,n,file2);}拓展坑点数组类型匹配intarr[20];// 错误fread(arr,1,20,fp);// 正确块大小使用sizeof(int)fread(arr,sizeof(int),20,fp);四、char数组底层原理易错点代码char arr[] {97,98,99};内存底层只存储数字97、98、99char占1字节fwrite第二个参数填1刚好匹配记事本按照ASCII码将字节翻译为abcint数组每个元素4字节块大小必须改为sizeof(int)否则数据错乱乱码二进制数组没有\0结束符和字符串规则区分开。五、完整无BUG代码1. 二进制文件拷贝代码图片、视频通用#define_CRT_SECURE_NO_WARNINGS#includestdio.h#includestdlib.hintmain(){// 二进制模式打开源文件、目标文件FILE*file1fopen(src.txt,rb);FILE*file2fopen(dest.txt,wb);// 空指针容错判断if(file1NULL||file2NULL){perror(打开失败);return1;}chararr[1024];// 货车缓冲区最大1024字节size_tn;// 保存本次实际读取字节数while((nfread(arr,1,1024,file1))!0){fwrite(arr,1,n,file2);}fclose(file1);fclose(file2);system(pause);return0;}2. 文本读写示例fputc/fputs#define_CRT_SECURE_NO_WARNINGS#includestdio.h#includestdlib.hintmain(){FILE*fpfopen(test.txt,w);if(fpNULL){perror(打开失败);return1;}fputc(A,fp);fputs(Hello World,fp);fclose(fp);system(pause);return0;}六、通用注意事项全部踩坑汇总文件打开模式区分‑w/wb清空原有文件内容从头写入‑r/rb只读文件不存在直接打开失败‑a/ab末尾追加写入不覆盖旧内容‑ 二进制文件读写必须带b(rb/wb/ab)防止换行符篡改文件。必须执行fclose()‑ 刷新缓冲区把内存数据写入磁盘避免数据丢失‑ 释放文件锁。EOF使用规则EOF(-1)仅用于fputc、fputsfread读取结束判断返回值是否为0。数据类型规范fread、fwrite返回值类型是size_t无符号整数接收变量优先用size_t禁止用int。VS编译警告配套处理‑ system()未定义添加头文件#include stdlib.h‑ fopen警告代码最顶部写#define _CRT_SECURE_NO_WARNINGS放在所有头文件前面强制规则清单① fopen之后立刻做空指针判断避免空指针崩溃② Windows路径必须转义\\或使用/③ 二进制文件模式必须带b④ 文件读写完毕一定要fclose⑤ 打开模式和读写操作保持匹配⑥ fread结束条件判断返回值是否为0禁止使用EOF⑦ 宏定义写在头文件最前面。
延伸阅读

更多相关文章

2026/9/9 13:14:31

vla学习笔记(2) lerobot配置gazebo

一、写gazebo.launch.py 直接复制下列文件,并且修改对应的文件名称import os from launch import LaunchDescription from launch.actions import ExecuteProcess, RegisterEventHandler, TimerAction from launch_ros.actions import Node from launch_ros.substit…

2026/9/10 16:33:25

概念、概要、详细设计编写心法

一文讲清概念设计、概要设计、详细设计:别再把三种文档写混了设计文档不是越细越好,而是要在正确阶段回答正确问题:概念设计统一业务语言,概要设计搭系统骨架,详细设计画代码施工图。很多研发同学写设计文档时&#xf…

2026/9/11 7:45:37

IntelliJ IDEA 2026.1 EAP 实测:Java 26 与 Spring Boot 4 支持体验

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/11 7:45:37

Kubernetes核心概念与集群部署运维实战指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/11 7:45:37

QT+ESP32室内运动场馆智能管理平台实战

简介:本资源是一项面向高校计算机、物联网或嵌入式方向本科生的毕业设计项目,聚焦室内运动场馆智能化管理场景,解决传统场地调度低效、预约流程不透明、环境状态难监控等实际运营痛点。项目采用QT(C)构建跨平台后端服务…

2026/9/11 7:45:37

SmartMediaKit与YOLO融合:实现低延迟视频播放与实时目标检测

做流媒体播放和做视觉分析,这两拨人平时很少坐在一起。但这两年越来越多的项目要求“边播放边看懂画面”,尤其是安防、智慧工厂、零售统计这类场景,不仅是把视频流拉出来给人看,还希望系统能自动识别画面里的目标。最开始我习惯用…

2026/9/11 7:40:37

电子元器件目标检测实战:YOLO产线选型与大模型协同优化

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/10 16:39:38

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/10 11:16:38

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/9 16:31:09

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/10 12:32:02

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/10 15:19:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/10 15:49:53

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

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

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

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