当前位置: 首页 > news >正文

C语言 | 文件操作详解与实战示例

🧩 C语言 | 文件操作详解与实战示例

✍️ 作者:凡间的八戒
🗓️ 时间:2025-11-12
🏷️ 标签:C语言、文件操作、IO流、fopen、fread、feof、ferror


🧠 前言

在 C 语言学习中,“文件操作”是非常关键的部分。
它赋予程序数据持久化的能力,让我们从屏幕输入输出走向真实的数据存储。

本文将带你全面掌握文件操作的核心内容,包含:

  • 文件概念与类型
  • 打开与关闭
  • 文本与二进制存储方式
  • 顺序/随机读写
  • 缓冲区机制
  • feof 与 ferror 的区别(重点)

一、为什么使用文件?

内存中的数据是临时的,程序退出后会被清除。
若想让数据长期保存,就必须将其写入磁盘文件

📘 例如:

  • 游戏存档
  • 程序日志
  • 用户配置

这些都是通过文件实现数据持久化的典型场景。


二、什么是文件?

在程序设计中,文件分为两类:

类型说明
程序文件存放源代码(.c)、目标文件(.obj)、可执行文件(.exe)
数据文件存放程序运行时需要读写的数据

三、文本文件与二进制文件

文件类型存储形式可读性示例
文本文件ASCII 编码可直接阅读.txt
二进制文件内存原始格式不可直接阅读.bin

📘 示例:

#include <stdio.h>int main() {int a = 10000;FILE* pf = fopen("test.txt", "wb");fwrite(&a, 4, 1, pf); // 二进制写入fclose(pf);return 0;
}

四、文件的打开与关闭

打开与关闭函数

FILE* fopen(const char* filename, const char* mode);
int fclose(FILE* stream);

打开模式速查表

模式含义文件不存在时
“r”只读文本出错
“w”只写文本新建
“a”追加写文本新建
“rb”只读二进制出错
“wb”只写二进制新建
“ab”追加二进制新建
“r+”读写文本出错
“w+”读写文本(重建)新建

📘 示例:

#include <stdio.h>
int main() {FILE* pFile = fopen("myfile.txt", "w");if (pFile != NULL) {fputs("fopen example", pFile);fclose(pFile);}return 0;
}

五、文件的顺序读写

函数功能
fgetc读取单个字符
fputc写入单个字符
fgets读取一行
fputs写入一行
fscanf格式化读取
fprintf格式化输出
fread二进制读取
fwrite二进制写入

📘 这些函数既可用于文件,也可用于标准流(stdin/stdout)。


六、文件的随机读写

fseek:移动文件指针

fseek(FILE* stream, long offset, int origin);

ftell:返回当前位置

long ftell(FILE* stream);

rewind:返回文件头

rewind(FILE* stream);

📘 示例:

#include <stdio.h>
int main() {FILE* pFile = fopen("example.txt", "wb");fputs("This is an apple.", pFile);fseek(pFile, 9, SEEK_SET);fputs(" sam", pFile);fclose(pFile);return 0;
}

七、文件读取结束的判断(重点)

在文件操作中,经常要判断文件是否读取完毕或发生错误。
这就需要使用 feof()ferror() —— 它们看似相似,实则完全不同!


🧩 点击展开 | feof() 与 ferror() 的区别详解

🔹 feof —— 判断是否到达文件末尾

int feof(FILE *stream);
  • 上一次读操作到达文件结尾时返回非0。
  • 必须先读取再判断,否则不会触发。

📘 错误示例:

while (!feof(fp)) { // ❌ 会多读一次fscanf(fp, "%d", &x);printf("%d\n", x);
}

📘 正确写法:

while (fscanf(fp, "%d", &x) == 1)printf("%d\n", x);if (feof(fp))printf("文件读取完毕\n");

🔹 ferror —— 判断是否发生读写错误

int ferror(FILE *stream);
  • 当发生 磁盘错误、权限不足或设备异常 时返回非0。

📘 示例:

FILE* fp = fopen("test.txt", "r");
if (!fp) {perror("打开失败");return 1;
}int c;
while ((c = fgetc(fp)) != EOF)putchar(c);if (ferror(fp))puts("❌ 文件读写错误!");
else if (feof(fp))puts("✅ 文件正常结束。");fclose(fp);

🔹 区别总结表

函数判断内容触发时机用途是否自动清除
feof到达文件尾读到EOF后判断读取结束
ferror发生错误I/O异常后判断设备问题

📘 可使用:

clearerr(FILE* stream);

清除错误与EOF状态。


🔹 对比示例

#include <stdio.h>
int main(void) {FILE* fp = fopen("demo.txt", "r");if (!fp) {perror("文件打开失败");return 1;}int c;while ((c = fgetc(fp)) != EOF)putchar(c);if (ferror(fp))printf("读取错误!\n");else if (feof(fp))printf("文件读取完毕。\n");fclose(fp);return 0;
}

🧠 总结一句话:

feof() 判断文件是否读完;
ferror() 判断是否出错;
二者互不替代,千万别混淆!


八、文件缓冲区机制

C语言使用缓冲文件系统来提升读写性能。
写入时数据先进入缓冲区,待缓冲满或 fflush() / fclose() 调用后才真正写入磁盘。

📘 示例:

#include <stdio.h>
#include <windows.h>int main() {FILE* pf = fopen("test.txt", "w");fputs("abcdef", pf);printf("睡眠10秒,此时文件内容未写入。\n");Sleep(10000);fflush(pf);printf("刷新缓冲区后写入成功。\n");fclose(pf);return 0;
}

九、总结与学习建议

核心要点:

  • 文件操作基本步骤:fopen → 读写 → fclose
  • 文本与二进制的本质区别在于存储形式
  • 判断结束不要直接用 feof()
  • 养成使用 fflush()fclose() 的好习惯

💡 建议练习:

  1. 设计一个“学生成绩保存系统”;
  2. fseek() 实现随机修改;
  3. 手动触发 I/O 错误测试 ferror()
http://www.dtcms.com/a/601755.html

相关文章:

  • Spring ThreadPoolTaskExecutor 与 CompletableFuture.supplyAsync 常用实践
  • 网站太卡怎么优化wordpress meta key
  • 现在入局自助KTV,算晚吗?
  • 用Microsoft Visual Studio Installer Projects 2022打包程序,同时安装VC++的运行库等
  • 南宁网站制作建设建设网站需要哪些语言
  • C语言在线编译工具 | 提升编程效率与学习体验
  • ARM《10》_03_字符设备驱动进阶(并发→竞态→同步机制、阻塞io和非阻塞io)
  • 【DaisyUI]】dropdown在点击菜单项之后不关闭,怎么破?
  • 常德公司做网站手机网站怎么做的好
  • 网站建设的可行性报告范文城市宣传片制作公司
  • Go语言编译型:高效的编程语言选择|深入探讨Go语言的编译特性与优势
  • 邓州网站制作企业网站设计思路
  • 区县政府税务数据分析能力建设DID(2007-2025)
  • Python图像处理基础(十九)
  • 全国产5G+WiFi6工业路由,适配工业4.0多元场景需求
  • LitJSON 轻量级、高效易用的 .NET JSON 库 深度解析与实战指南
  • 什么是虚拟现实(VR)?
  • 织梦手机电影网站模板创意平面设计公司
  • Hadess入门到精通 - 如何管理Maven制品
  • 一文分清:零样本、小样本、微调,使用 LLM 的三种方式
  • 网站建设用什么科目黔东南购物网站开发设计
  • 数字化转型绕不开的“地基”:IT基础架构运维如何破局?
  • Go 语言编译优化与性能提升
  • Ansible安装与常用模块
  • Linux新
  • 建站平台哪个好承德做网站的公司
  • wordpress 用户投稿吉林百度seo
  • 通过网络调试,上位机电脑控制下位机单片机板载灯的亮灭
  • 学习笔记八:对数几率回归
  • Linux如何从docker hub下载arm镜像