news 2026/4/25 2:49:00

文件读写操作与易错点总结

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
文件读写操作与易错点总结


个人主页: 流年如夢

专栏: 《C语言》

文章目录

  • 一.了解文件
    • 1.1为什么需要使用文件
    • 1.2什么是文件
  • 二.二进制文件和文本文件
    • 2.1文本文件
    • 2.2二进制文件
  • 三.文件的打开(fpoen)和关闭(fclose)
    • 3.1流和标准流
    • 3.2文件指针
    • 3.3fopen --> 打开文件
    • 3.4fclose -- > 关闭文件
    • 3.5举例
  • 四.文件的顺序读写([cplusplus链接](https://legacy.cplusplus.com/)👈)
    • 表格
    • 4.1fputc与fgetc
      • 4.1.1函数原型
      • 4.1.2举例
    • 4.2fputs与fgets
      • 4.2.1函数原型
      • 4.2.2举例
    • 4.3fprintf与fscanf
      • 4.3.1函数原型
      • 4.3.2举例
    • 4.4fwrite与fread
      • 4.41函数原型
      • 4.4.2举例
    • 4.5三组函数对比
  • 五.文件的随机读写
    • 5.1fseek --> 定位文件指针
    • 5.2ftell --> 获取当前偏移
    • 5.3rewind --> 回到文件开头
  • 六.文件读取结束的判定(feof与ferror)
    • 6.1feof
    • 6.2ferror
  • 七.文件缓冲区
  • 八.更新文件(r+、w+、a+)
  • 🎯总结
  • ⚠️易错点

Ladies and gentlemen,本篇文章讲的是文件操作,下面将带领大家学习文件打开关闭(fopen、fclose)、顺序读写、随机读写、结束判定、文件缓冲区、更新文件等;全程高能,不容错过!!!
前言

程序运行时的数据都存放在内存中,程序退出后数据就会丢失。如果想让数据持久化保存,就必须用到文件操作。C语言提供了完整的文件读写接口,支持文本和二进制两种存储格式,能实现数据的写入、读取、修改、追加等功能。本篇文章带你从零掌握文件操作,写出稳定、安全、规范的文件处理代码。

一.了解文件

1.1为什么需要使用文件

因为程序退出后,内存数据会被回收,数据无法保存;但使用文件可以把数据存放在硬盘中,实现数据持久化;在下次运行程序时,可以从文件中读取历史数据。

1.2什么是文件

磁盘上的文件就是文件,例如我们电脑都有的C盘和D盘

当然,在程序设计中分为两类:程序文件和数据文件

程序文件

  1. 源文件(.c
  2. 目标文件(.obj
  3. 可执行程序(.exe

数据文件(本篇重点)

程序运行时用于读写数据的文件

文件名

文件名 =文件路径 + 文件名主干 + 后缀

例如:c:\code\test.txt

二.二进制文件和文本文件

2.1文本文件

ASCII字符形式存储,可以直接看懂的

2.2二进制文件

以内存二进制形式存储,节省空间、读写快

举个例子:

#include<stdio.h>intmain(){inta=10000;FILE*pf=fopen("test.txt","wb");fwrite(&a,4,1,pf);fclose(pf);pf=NULL;return0;}

分析wb是以二进制只写方式打开;fwrite是按二进制写入,int只占4字节

运行结果:

在这里程序没有报错,说明运行成功;这时双击左上角打开文件test.txt(或ctrl+c),我们可以看到10000二进制方式写入文件,如下所示:

三.文件的打开(fpoen)和关闭(fclose)

3.1流和标准流

流(stream):数据传输的抽象,可理解为 “数据的河流”

三个默认标准流

  1. stdin--> 标准输入(用键盘)
  2. stdout--> 标准输出(在屏幕上)
  3. stderr--> 标准错误

3.2文件指针

每个打开的文件,系统都会创建一个FILE结构体信息区,我们用FILE*指针来操作文件

3.3fopen --> 打开文件

函数原型

FILE*fopen(constchar*filename,constchar*mode);

其中打开失败返回NULL,必须判断;mode是打开方式(例如r、w、a、rb、wb、ab、r+、w+、a+…

3.4fclose – > 关闭文件

函数原型

intfclose(FILE*stream);

使用fclose关闭文件,并刷新缓冲区;关闭后必须把指针置 NULL

3.5举例

#include<stdio.h>intmain(){FILE*fp=fopen("test.txt","r");//这里先打开文件if(fp==NULL){perror("fopen");return1;}// 读写操作...fclose(fp);//最后关闭文件fp=NULL;return0;}

🧐分析:先打开判断、用完关闭、最后指针置空;perror是用来直接打印错误原因,方便调试

四.文件的顺序读写(cplusplus链接👈)

表格

函数功能适用
fputc写一个字符所有输出流
fgetc读一个字符所有输入流
fputs写一行字符串所有输出流
fgets读一行字符串所有输入流
fprintf格式化写入所有输出流
fscanf格式化读取所有输入流
fwrite二进制块写入文件流
fread二进制块读取文件流

4.1fputc与fgetc

4.1.1函数原型

功能:向指定流中写入一个字符,写完后文件指针自动后移
参数:character是要写入的字符;stream是目标文件流
返回值:成功返回写入的字符,失败返回EOF

功能:从指定流中读取一个字符,读完后文件指针自动后移
参数:stream是要读取的文件流
返回值:成功返回读到的字符,读到末尾或出错返回EOF

4.1.2举例

//写入fputc('a',fp);//读取intch=fgetc(fp);

4.2fputs与fgets

4.2.1函数原型

功能:向文件中写入一个字符串,不写入末尾\0
参数:str是要写入的字符串;stream是目标文件流
返回值:成功返回非负数,失败返回EOF

功能:从文件中读取一行或指定长度字符串
参数:str是存放读取内容;num是最多读num-1个字符;stream是文件流
返回值:成功返回str,失败或到末尾返回NULL

4.2.2举例

fputs("hello world",fp);charbuf[100]={0};fgets(buf,100,fp);

4.3fprintf与fscanf

4.3.1函数原型

功能:格式化写入文件,用法和printf几乎一样
参数:stream是目标流;format是格式化字符串;后续为输出参数
返回值:成功返回写入字符数,失败返回负数

功能:格式化读取文件内容,用法和scanf类似
参数:stream是输入流;format是格式串;后续为地址参数
返回值:成功返回读取参数个数,失败或到末尾返回EOF

4.3.2举例

structStu{charname[20];intage;};//写入fprintf(fp,"%s %d",s.name,s.age);//读取fscanf(fp,"%s %d",s.name,&s.age);//数组name本身就是指针,不需要 &

4.4fwrite与fread

4.41函数原型

功能:以二进制形式整块写入文件
参数:ptr是数据地址;size是一个元素大小;count是元素个数;stream是文件流
返回值:成功写入的元素个数

功能:以二进制形式从文件整块读取数据
参数:ptr是接收数据的缓冲区;size是一个元素大小;count是要读个数;stream是文件流
返回值:实际读到的元素个数

4.4.2举例

//写入fwrite(&s,sizeof(structStu),1,fp);//读取fread(&s,sizeof(structStu),1,fp);

4.5三组函数对比

函数功能
scanf从标准输入读
fscanf任意流
sscanf字符串
printf打印到标准输出
fprintf打印到任意流
sprintf打印到字符串

五.文件的随机读写

5.1fseek --> 定位文件指针

函数原型:

SEEK_SET --> 文件开头
SEEK_CUR --> 当前位置
SEEK_END --> 文件末尾

例如:

fseek(fp,offset,origin);

5.2ftell --> 获取当前偏移

函数原型:

功能:返回当前文件指针相对于开头的偏移量

例如:

longpos=ftell(fp);

5.3rewind --> 回到文件开头

函数原型:

功能:把文件指针重置到文件开头

例如:

rewind(fp);

六.文件读取结束的判定(feof与ferror)

6.1feof

判断是否是正常读到文件末尾

if(feof(fp))printf("读到文件末尾\n");

6.2ferror

判断是否是发生读取错误

if(ferror(fp))printf("读取出错\n");

注意:feof不是用来判断是否结束,而是结束后判断是 “读到尾” 还是 “出错”

七.文件缓冲区

系统会为每个文件自动开辟缓冲区;数据先写缓冲区,满了或刷新才写入磁盘;fflush(fp)会强制刷新缓冲区

fputs("abc",fp);fflush(fp);//立即写入磁盘

八.更新文件(r+、w+、a+)

模式文件不存在原有内容指针位置
r+打开失败保留开头
w+创建新文件清空开头
a+创建新文件保留末尾

规则

写完读:必须fflushfseek
读完写:必须fseekrewind

🎯总结

  1. 文件用于数据持久化,分为文本文件和二进制文件
  2. 操作流程为fopen--> 读写 -->fclose--> 置空(NULL
  3. 打开文件必须判断是否为NULL
  4. 顺序读写fgetcfputcfgetsfputsfprintffscanf
  5. 二进制读写有freadfwrite
  6. 随机读写fseekftellrewind
  7. 结束判定时要用feofferror区分结束原因
  8. 缓冲区fflush强制刷新,fclose自动刷新
  9. 更新模式读写切换必须刷新或重定位

⚠️易错点

  1. 不判断fopen返回值,直接使用空指针
  2. 忘记fclose,导致数据丢失、文件占用
  3. fclose后不置空,形成野指针
  4. 混淆文本方式与二进制方式
  5. fgets读取时包含\n,处理不当出错
  6. 读写切换不刷新、不定位,导致读写异常
  7. feof提前判断循环结束,逻辑错误
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/25 2:42:19

OpenSim肌肉模型详解:Hill-Type模型背后的生理学原理与参数调优实战

OpenSim肌肉模型详解&#xff1a;Hill-Type模型背后的生理学原理与参数调优实战 在运动生物力学研究中&#xff0c;肌肉模型的精确度直接决定了仿真结果的可靠性。当你在OpenSim中反复调整F0M、l0M等参数却始终无法匹配实测数据时&#xff0c;问题的根源往往不在于软件操作&…

作者头像 李华
网站建设 2026/4/25 2:40:21

AI提示词与模型仓库:提升开发效率的系统化解决方案

1. 项目概述&#xff1a;AI工具的系统提示词与模型仓库 如果你和我一样&#xff0c;在AI应用开发或日常工作中&#xff0c;经常需要为不同的任务寻找合适的提示词&#xff08;Prompt&#xff09;和模型&#xff0c;那你一定体会过那种“东拼西凑”的烦恼。今天要聊的这个项目&…

作者头像 李华
网站建设 2026/4/25 2:38:17

开源情绪感知虚拟岛屿:脑机接口与生理信号交互实践

1. 项目概述&#xff1a;一个开源的情绪感知与交互虚拟岛屿最近在GitHub上闲逛&#xff0c;发现了一个挺有意思的项目&#xff0c;叫“open-vibe-island”。光看名字&#xff0c;你可能会觉得这是个游戏或者某种虚拟社交空间。但点进去深入研究后&#xff0c;我发现它的内核远比…

作者头像 李华
网站建设 2026/4/25 2:37:49

1128. 等价多米诺骨牌对的数量

题目链接 1128. 等价多米诺骨牌对的数量 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一组多米诺骨牌 dominoes 。 形式上&#xff0c;dominoes[i] [a, b] 与 dominoes[j] [c, d] 等价 当且仅当 (a c 且 b d) 或者 (a d 且 b c) 。即一张骨牌可以通过旋转 …

作者头像 李华