news 2026/8/23 7:57:50

C语言文件操作与标准IO详解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C语言文件操作与标准IO详解

1. 文件的基本概念

文件:存放在磁盘空间中的一段数据的集合,是操作系统管理数据的基本单位。

2. 文件操作的三个基本步骤

  1. 打开文件:建立程序与文件之间的连接
  2. 读写文件:对文件内容进行读取或写入操作
  3. 关闭文件:断开程序与文件的连接,释放资源

3. ASCII码文件与二进制文件

ASCII码文件:一种特殊的二进制文件,文件中的每个字符都是能够显示在终端的ASCII码字符。

  • 常见类型:文本文件、程序源代码

二进制文件:文件中包含一些不能在终端直接显示的ASCII码字符。

  • 常见类型:图片、音视频、压缩包

4. 标准IO函数接口

4.1 fopen函数

流(Stream):有方向性、具有连续性的数据通道。

三个标准流会随着程序的执行被默认打开:

  • stdin:标准输入流
  • stdout:标准输出流
  • stderr:标准错误流

函数原型

FILE *fopen(const char *pathname, const char *mode);

功能:打开pathname对应的文件,并与之建立一个流。

参数

  • pathname:要打开的文件路径字符串首地址
  • mode:打开文件的方式
    • "r":只读。文件不存在报错,文件存在只读打开
    • "r+":读写。文件不存在报错,文件存在读写打开
    • "w":只写。文件不存在创建,文件存在清空,只写打开
    • "w+":写读。文件不存在创建,文件存在清空,写读打开
    • "a":追加只写。文件不存在创建,文件存在追加只写打开
    • "a+":追加读写。文件不存在创建,文件存在追加读写打开

返回值

  • 成功:返回创建的流的空间首地址(FILE指针)
  • 失败:返回NULL

4.2 fclose函数

函数原型

int fclose(FILE *stream);

功能:关闭流。

参数stream:文件流指针

返回值

  • 成功:返回0
  • 失败:返回EOF

5. 缓存机制

标准IO是有缓存的IO,用户调用标准IO函数后,数据先进入缓存区,满足刷新条件时才将数据传递给内核。

缓存类型

5.1 全缓存

  • 缓存区大小:4K(4096字节)
  • 刷新条件
    1. 缓存区满刷新
    2. 使用fflush强制刷新
    3. 程序结束或fclose刷新
  • 适用场景:与文件建立的流都为全缓存

5.2 行缓存

  • 缓存区大小:1K(1024字节)
  • 刷新条件
    1. 缓存区满刷新
    2. 使用fflush强制刷新
    3. 程序结束或fclose刷新
    4. 遇到\n刷新
  • 适用场景:与终端建立的流(stdin、stdout)

5.3 不缓存

  • 缓存区大小:0K(立即刷新)
  • 适用场景:出错处理、人机交互、实时性要求高的场景
  • 示例:stderr

6. 文件读写函数接口

6.1 fputc函数

函数原型

int fputc(int c, FILE *stream);

功能:将字符c写入流中。

参数

  • c:要写入的字符
  • stream:文件流指针

返回值

  • 成功:返回写入字符的ASCII码值
  • 失败:返回EOF(-1)

练习:利用fputc将"hello world"写入a.txt文件中

6.2 fgetc函数

函数原型

int fgetc(FILE *stream);

功能:从流中读取一个字符。

参数stream:文件流指针

返回值

  • 成功:返回接收字符的ASCII码值
  • 失败:返回EOF
  • 读到文件末尾:返回EOF

练习:编写程序统计某个指定文件的行数

7. 其他常用文件读写函数

  • fputs/fgets:字符串读写
  • fprintf/fscanf:格式化读写
  • fwrite/fread:二进制读写

8. 更多文件操作函数详解

8.1 fprintf函数

函数原型

int fprintf(FILE *stream, const char *format, ...);

功能:将格式化的字符串写入stream流中。

参数

  • stream:文件流指针
  • format:格式化字符串空间首地址
  • ...:可变参数列表

返回值

  • 成功:返回打印在终端的字符个数
  • 失败:返回负数

8.2 fputs函数

函数原型

int fputs(const char *s, FILE *stream);

功能:将s指向的字符串写入stream流中。

参数

  • s:要写入字符串空间的首地址
  • stream:文件流指针

返回值

  • 成功:返回非负整数
  • 失败:返回EOF

8.3 fgets函数

函数原型

char *fgets(char *s, int size, FILE *stream);

功能:从流中读取一行字符串。

参数

  • s:读取字符串存入空间的首地址
  • size:最多读取字符的个数
  • stream:文件流指针

返回值

  • 成功:返回s空间地址
  • 失败或读到文件末尾:返回NULL

8.4 fwrite函数

函数原型

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);

功能:向流中写入nmemb个对象,每个对象size个字节,数据来自ptr指向的空间。

参数

  • ptr:写入数据空间首地址
  • size:每个数据对象的大小
  • nmemb:对象个数
  • stream:文件流指针

返回值

  • 成功:返回实际写入对象的个数
  • 失败:返回0

8.5 fread函数

函数原型

size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);

功能:从流中读取nmemb个对象,每个对象size个字节,存放在ptr指向的空间中。

参数

  • ptr:存放数据空间的首地址
  • size:读取对象的大小
  • nmemb:读取对象的个数
  • stream:文件流指针

返回值

  • 成功:返回读取对象个数
  • 失败或读到末尾:返回0

练习:利用fread和fwrite实现将源图片中的内容拷贝到目的文件中

8.6 fseek函数

函数原型

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

功能:重新设置流的偏移量。

参数

  • stream:文件流指针
  • offset:偏移量
  • whence
    • SEEK_SET:定位到文件开头
    • SEEK_CUR:定位到当前位置
    • SEEK_END:定位到文件末尾

返回值

  • 成功:返回0
  • 失败:返回-1

8.7 ftell函数

函数原型

long ftell(FILE *stream);

功能:获得流的偏移量。

8.8 rewind函数

函数原型

void rewind(FILE *stream);

功能:重新将流偏移量定位到开头。

练习:编写一个程序获得文件的长度

9. 综合练习

作业1

  1. 编写程序从给定的src.bmp图片中读取图片的宽度和高度,并打印
  2. 从终端输入一个单词,打印出该单词的含义
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/8/23 7:57:37

长会话虚拟滚动与渲染优化

逻辑图依赖:tanstack/vue-virtual,版本建议最新,它支持动态可变高度,不需要提前知道每条消息高度。1. 安装依赖npm install tanstack/vue-virtual # or pnpm pnpm add tanstack/vue-virtual2. 完整可运行 Vue3 示例1. useChatVirt…

作者头像 李华
网站建设 2026/8/23 7:57:05

数学建模创新思维:从解题到造题的实战路径

1. 项目概述:从“解题”到“造题”的思维跃迁 干了这么多年数学建模,带过不少学生,也评过不少竞赛论文,我发现一个普遍现象:很多队伍在技术实现上已经相当熟练,模型、算法、代码信手拈来,但最终…

作者头像 李华
网站建设 2026/8/23 7:56:48

潜在多智能体通信中隐蔽协同的检测:从行为序列分析到工程实践

在分布式系统、多智能体协作和复杂网络交互的工程实践中,一个长期存在的挑战是:如何识别那些不通过显式、预定义协议进行通信,而是通过隐式、潜在信号进行协调的智能体行为。这类“潜在多智能体协同”现象广泛存在于自动化交易系统、游戏AI、…

作者头像 李华
网站建设 2026/8/23 7:55:39

Revit建筑设计思维与实战:从BIM核心到施工图全流程

在BIM项目实践中,Revit作为核心建模工具,其高效应用远不止于软件操作本身,更在于一套系统化的设计思维与工作流程。很多初学者在掌握了基础命令后,依然在项目协同、参数化设计及出图效率上遇到瓶颈。本文将围绕一套实战导向的Revi…

作者头像 李华
网站建设 2026/8/23 7:54:09

XGBoost优化机制与并行化实现深度解析:从理论到工程实践

1. 项目概述:从“黑箱”到“白盒”,拆解XGBoost的工程艺术 如果你在数据科学或机器学习领域摸爬滚打过一阵子,那么“XGBoost”这个名字对你来说,可能熟悉得像一个老朋友。在各种数据竞赛的冠军方案里,在工业界风控、推…

作者头像 李华
网站建设 2026/8/23 7:53:29

具身智能技术栈核心:大脑、小脑与桥接层的实时调度实践

如果你最近关注科技展会,可能会有一个强烈的感受:今年几乎所有大型展会,从CES到世界人工智能大会,再到各种行业峰会,“具身智能”都成了最热门的展区。展台上人形机器人、机械臂、四足机器人琳琅满目,动作流…

作者头像 李华