文件读写全套易错笔记
一、语法类错误错误代码修正代码错误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⑦ 宏定义写在头文件最前面。

相关新闻

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

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/7/19 15:27:07阅读更多 →
如何用BepInEx为游戏注入新生命:插件框架终极指南

如何用BepInEx为游戏注入新生命:插件框架终极指南

如何用BepInEx为游戏注入新生命:插件框架终极指南 【免费下载链接】BepInEx Unity / XNA game patcher and plugin framework 项目地址: https://gitcode.com/GitHub_Trending/be/BepInEx 想不想让你最喜欢的游戏变得更有趣?想不想为Unity游戏添加…

2026/7/19 15:25:07阅读更多 →
RustDesk远程桌面:3步快速上手自托管远程控制方案

RustDesk远程桌面:3步快速上手自托管远程控制方案

RustDesk远程桌面:3步快速上手自托管远程控制方案 【免费下载链接】rustdesk An open-source remote desktop application designed for self-hosting, as an alternative to TeamViewer. 项目地址: https://gitcode.com/GitHub_Trending/ru/rustdesk 你是否…

2026/7/19 15:25:07阅读更多 →
从理论到实践:LLaDA2.2-flash智能体应用开发的完整路线图

从理论到实践:LLaDA2.2-flash智能体应用开发的完整路线图

从理论到实践:LLaDA2.2-flash智能体应用开发的完整路线图 【免费下载链接】LLaDA2.2-flash 项目地址: https://ai.gitcode.com/hf_mirrors/inclusionAI/LLaDA2.2-flash LLaDA2.2-flash是一款面向智能体应用的扩散语言模型,通过引入Levenshtein编…

2026/7/19 23:49:01阅读更多 →
NitroStack缓存策略指南:提升AI应用响应速度的5种终极方法

NitroStack缓存策略指南:提升AI应用响应速度的5种终极方法

NitroStack缓存策略指南:提升AI应用响应速度的5种终极方法 【免费下载链接】nitrostack The full-stack TypeScript framework to build, test, and deploy production-ready MCP servers and AI-native apps. 项目地址: https://gitcode.com/gh_mirrors/ni/nitro…

2026/7/19 23:49:01阅读更多 →
为什么选择6bit量化?Laguna-XS-2.1-6bit在速度、显存与质量间的完美平衡

为什么选择6bit量化?Laguna-XS-2.1-6bit在速度、显存与质量间的完美平衡

为什么选择6bit量化?Laguna-XS-2.1-6bit在速度、显存与质量间的完美平衡 【免费下载链接】Laguna-XS-2.1-6bit 项目地址: https://ai.gitcode.com/hf_mirrors/mlx-community/Laguna-XS-2.1-6bit Laguna-XS-2.1-6bit是一款基于MLX框架的6bit量化模型&#xf…

2026/7/19 23:49:01阅读更多 →
低代码能做会员管理吗?从技术实现角度拆解可行性

低代码能做会员管理吗?从技术实现角度拆解可行性

从技术实现角度来说,这个问题没有一刀切的答案。作为一名在系统开发领域摸爬滚打多年的开发者,我见证过不少团队用这种方式快速上线会员系统,也见过一些项目因为选型失误而陷入泥潭。低代码在会员管理场景下的可行性,取决于你的业…

2026/7/19 23:49:01阅读更多 →
为什么选择xSTUDIO?对比主流后期审核软件的优势分析

为什么选择xSTUDIO?对比主流后期审核软件的优势分析

为什么选择xSTUDIO?对比主流后期审核软件的优势分析 【免费下载链接】xstudio xSTUDIO is a modern, high performance and feature rich playback and review application designed for organisations and individuals in the post production, VFX and Animation …

2026/7/19 23:49:01阅读更多 →
终于搞懂 Kueue:5 个核心对象一次讲透

终于搞懂 Kueue:5 个核心对象一次讲透

很多人刚接触 Kueue 时最大的困惑,不是 YAML 怎么写,而是看着一堆 CRD:ResourceFlavor、ClusterQueue、LocalQueue、Cohort、Workload,不知道它们之间到底是什么关系。本文不会逐个照着 API 文档介绍字段,而是把这五个…

2026/7/19 23:47:01阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/19 0:01:04阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/19 0:01:04阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/19 0:01:04阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

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

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

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

2026/7/19 22:50:49阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

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

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

2026/7/19 14:50:26阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

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

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

2026/7/19 18:50:36阅读更多 →