C语言文件读写流程:fopen模式、fputc/fgetc用法与代码示例

南乔
南乔
发布时间:2026-10-15| 5人浏览过
原创

C语言通过stdio.h库提供的标准接口进行高效的文件管理。核心流程包括使用fopen按指定模式(文本或二进制)打开文件获取FILE指针,利用fputc/fputs/fprintf写入数据,以及用fgetc/fgets/fscanf逐字符或逐行读取。操作结束时必须调用fclose释放缓冲区与内存。

准备条件与环境设置

所有文件操作均需包含头文件 #include <stdio.h>。操作对象本质上是字节流,分为文本文件和二进制文件两种处理方式。

第一步:打开和关闭文件

1. 初始化与访问模式

使用 fopen 创建新文件或打开已有文件,返回指向 FILE 结构的指针。该结构封装了文件状态与控制信息:

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

访问模式 mode 决定了文件的交互方式:

二进制模式:处理非文本数据时,需在上述模式后加上 b,例如 "rb", "wb", "ab", "rb+", "r+b", "wb+", "w+b", "ab+", "a+b"。

2. 安全关闭资源

操作完成后必须调用 fclose。它会清空缓冲区、关闭底层文件句柄并释放分配的内存:

int fclose( FILE *fp );

若成功关闭返回0;若发生错误返回 EOF(定义在 <stdio.h> 中的常量)。

第二步:向文件写入数据

C语言提供多种写入函数以适应不同需求:

  • fputc(c, fp):写入单个字符。成功返回字符值,失败返回 EOF。
  • fputs(s, fp):写入以 null 结尾的字符串。成功返回非负值,失败返回 EOF。
  • fprintf(fp, format, ...):格式化输出字符串。

3. 写入实例(Linux环境)

演示使用 w+ 模式读写,并在同一文件中先写后读。注意:/tmp 是 Linux 临时目录,Windows 用户需修改为存在的路径如 C:\\tmp。

#include <stdio.h>
int main()
{
   FILE *fp = NULL;
   // 打开文件用于读写,无则创建
   fp = fopen("/tmp/test.txt", "w+");
   fprintf(fp, "This is testing for fprintf...\n");
   fputs("This is testing for fputs...\n", fp);
   
   // 后续将在此处添加读取代码,见下一步骤
   fclose(fp);
   return 0;
}

第三步:从文件读取数据

读取策略取决于需要的粒度:

  • fgetc(fp):读取单个字符,遇到错误或EOF返回 EOF。
  • fgets(buf, n, fp):最多读取 n-1 个字符,自动追加 null 终止符。关键点:若在读满前遇到换行符 '\n' 或EOF,仅返回已读内容(含换行符),剩余部分留在缓冲供下次调用。
  • fscanf(fp, "%s", buf):格式化读取。与 gets/fgets 不同,它会在遇到第一个空格或换行符时停止。

4. 读取实战与边界解析

承接上一步,在同一个 test.txt 中接续读取:

#include <stdio.h>
int main()
{
   FILE *fp = NULL;
   char buff[255];
   
   // 必须以 'r' 重新打开或保持之前的 'w+' 状态继续
   // 此处假设文件已存在且指针已定位到合适位置
   fp = fopen("/tmp/test.txt", "r");
   
   // 第一次读取:只读到空格处结束
   fscanf(fp, "%s", buff);
   printf("1: %s\n", buff ); // 输出: This
   
   // 第二次读取:由于之前停在空格,fgets读取该行剩余部分
   fgets(buff, 255, (FILE*)fp);
   printf("2: %s\n", buff ); // 输出:  is testing for fprintf...
   
   // 第三次读取:读取下一整行
   fgets(buff, 255, (FILE*)fp);
   printf("3: %s\n", buff ); // 输出: This is testing for fputs...
   
   fclose(fp);
   return 0;
}

执行结果逻辑解析:

  1. fscanf 因 %s 格式限制,只抓取了“This”,光标停在空格处。
  2. fgets 紧接着读取剩余字符“ is testing for fprintf...\n”。
  3. 第二次 fgets 完整读取第二行“ This is testing for fputs...\n”。

第四步:二进制块传输

对于数组、结构体等大块存储,使用原始字节读写函数:
size_t fread(void *ptr, size_t size, size_t count, FILE *stream);
size_t fwrite(const void *ptr, size_t size, size_t count, FILE *stream);

以上就是C语言文件读写操作的详细内容,更多关于C语言文件管理的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。