文件的顺序读写
看完你能区分文本/二进制读写、搞懂缓冲机制与 EOF 的判定细节
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
文件的顺序读写
看完你能区分文本/二进制读写、搞懂缓冲机制与 EOF 的判定细节
什么是文件?
上页我们按顺序把字节从硬盘流出来——但这些字节到底存在哪里?为什么写完关掉程序,下次再打开还在?答案藏在一层叫「文件系统」的中间层里。
索书号对应文件名,索引卡对应映射表,书架位置对应扇区
文本文件 vs 二进制文件
上一节我们认识了文件就是磁盘上的一串字节。但在读写文件时你会发现:同样是字节,有的打开能直接读懂,有的却是满屏乱码——这背后是两种不同的存储方式。
明文人人能直读;摩斯只是一串点划,要靠密码本才能还原内容
FILE 指针与文件缓冲区
用 fopen 打开文件时拿到一个 FILE*,它不是文件本身,而是 C 标准库的「调度中心」——背后挂着一块缓冲区,决定数据何时真正落盘。
FILE* 是取件码,缓冲区是驿站货架,磁盘是远端仓库
文件操作的三步走
文件操作按打开、读写、关闭三步走,缺一步都可能留隐患。
文件操作的代码模板
标准 C 文件读写完整模板:打开→读写→关闭,每步都带回值检查。
L6 fopen 拿 FILE*;L7 NULL 必查;L14 fwrite 是 (buf, 大小, 个数, fp);L15 返回值看是否部分写入;L20 fclose 隐式 flush 缓冲区。
fgetc 与 fputc 函数
上一页搭好了「打开-读写-关闭」的代码骨架,现在往读写这一步里填具体动作。最简单的读写单位是一个字符,对应的接口就是 fgetc 和 fputc。这俩函数虽然功能简单,但返回值藏着坑。
每过一个产品返回一件,分拣完末尾返回空箱 EOF
字符读写代码示例
用 fgetc 和 fputc 把一个文件逐字符复制到另一个文件——把刚学的 API 串成完整程序。
高亮行串成字符复制的完整链路:int 装返回值、NULL 守护打开、EOF 守护循环、fputc 配对 fgetc、fclose 收尾。
文件字符 I/O vs 标准 I/O
两个看似无关的函数,其实是一对「通用版」与「特供版」——搞清楚参数,就一次都忘不了。
- 操作任意已打开的 FILE* 文件流
- 必须显式传入 FILE* 参数
- 通用:磁盘文件、管道、网络都支持
- 仅操作 stdin / stdout 两个标准流
- 无参数,固定绑定标准流
- 专用:只服务键盘输入与屏幕输出
fgets 与 fputs 函数
字符级 fgetc/fputc 是一字一字搬砖,要读一整行得自己写循环。字符串级接口一步到位,但行为细节藏了不少坑。
n 是耐心上限;遇句号(\n)或翻到末页(EOF)即停;句号留在笔记里
字符串读写代码示例
用 fgets 按行读、fputs 按行写,把整份文本文件打印到屏幕。
fgets 一次读一行(含换行符),读到末尾返回 NULL 退出循环;缓冲区大小写 sizeof(line) 而非硬编码 256,改数组长度时不用动循环。
fgets 与 gets 的安全区别
两者名字只差一个字母,安全级别却天差地别——gets 没有长度参数,是缓冲区溢出的经典源头。
- 调用时必须传入缓冲区大小 n
- 保留换行符并自动加 '\0'
- C 标准一直保留,主流推荐
- 不接长度参数,能读多少读多少
- 丢弃换行符,只加 '\0'
- C11 已从标准库移除
fprintf 与 fscanf 函数
前面 fputs 只能写整串、fgets 只能读整行。要存「姓名:张三,年龄:20」这种带格式内容或按格式解析,该怎么办?这就要靠 fprintf 和 fscanf。
模板相同,printf 写到屏幕,fprintf 写到指定文件
格式化读写代码示例
用 fprintf 把一个结构体数组写入文本文件,再按相同格式用 fscanf 读回并打印。
写端 fprintf 用 "%s %d %f" 把三个字段拼成一行;读端 fscanf 必须用完全相同的格式串,数组字段直接传名(已是地址)、标量字段必须 &,返回值 == 字段数才算成功。
fread 与 fwrite 函数
前面 fgetc、fgets、fprintf 都在处理文本字符。但如果要读写一个完整的结构体、一段二进制数据,就需要按"整块"搬运的接口——fread 与 fwrite。
fgetc 像逐字抄写,fread 像整页复印——原样复制,无格式转换
数据块读写代码示例
用 fwrite / fread 把整个结构体当作字节块原样读写
wb/rb 强制二进制模式;fwrite 把 sizeof(Student) 个字节直接落盘,fread 再按同样大小读回,字段自动复原。
文本模式 vs 二进制模式
同样是打开文件,加不加「b」差别很大——文本模式会偷偷改你的换行符,二进制模式一字节都不动。
- Windows 下 \n 自动转 \r\n,读时再转回
- 配 fprintf/fscanf/fgets/fputs 等文本函数
- 适合日志、配置、源码等人类可读内容
- 字节原样存取,不做任何转换
- 配 fread/fwrite 按数据块读写
- 适合图片、结构体等需保留原始字节的数据
文件读写函数全景图
- ✓按数据形态选函数,分四档粒度
- ✓结构体与原始字节走二进制通道
- ✓缓冲区放大批量 I/O 的性能差距
- ✓读循环靠 feof/ferror,不用 EOF
课后思考
深入探究文件操作的边界与陷阱