C 语言文件 I/O 实战:创建、打开、读写、关闭文件完全指南
C 语言文件管理概览
C 语言标准库 stdio.h 提供完整函数套件操作磁盘持久化数据。掌握这些工具能可靠地创建、读取、写入、关闭文件,保障数据完整性与程序稳健性。
核心文件处理函数
| 函数 | 用途 |
|---|---|
fopen() | 打开现有文件或创建新文件 |
fclose() | 关闭打开的文件并释放资源 |
fprintf() | 向文件写入格式化文本 |
fscanf() | 从文件读取格式化数据 |
getc() | 从文件读取单字符 |
putc() | 向文件写入单字符 |
fgets() | 读取整行到缓冲区 |
fputs() | 向文件写入字符串(无格式化) |
fseek() | 移动文件指针到指定位置 |
ftell() | 获取当前文件指针位置 |
rewind() | 将文件指针重置到开头 |
文件模式详解
| 模式 | 说明 |
|---|---|
"r" | 只读打开;文件不存在则失败 |
"w" | 只写打开;截断现有文件或创建新文件 |
"a" | 追加打开;写入追加到文件末尾 |
"r+" | 读写打开,从文件开头 |
"w+" | 读写打开;截断现有文件 |
"a+" | 读写打开;追加新数据 |
创建文件
先声明文件指针,再用 fopen() 指定文件名与模式:
FILE *fp;
fp = fopen("data.txt", "w");
文件不存在则创建;存在则按模式决定保留或覆盖。
也可用绝对路径:
fp = fopen("D:/data.txt", "w");
文件创建步骤图示:


关闭文件
完成所有文件操作后,务必调用 fclose() 释放文件描述符并刷新缓冲区:
fp = fopen("data.txt", "r");
...
fclose(fp);
成功返回 0,失败返回 EOF。虽程序退出时系统自动关闭文件,但显式关闭是最佳实践。
写入文件
写入时需显式添加换行符(\n)。常用写函数:
fputc(char, FILE*)– 写单字符fputs(const char*, FILE*)– 写空终止字符串fprintf(FILE*, const char*, …)– 写格式化输出
示例:fputc()
#include <stdio.h>
int main() {
int i;
FILE *fptr;
const char *str = "Guru99 Rocks\n";
fptr = fopen("fputc_test.txt", "w");
for (i = 0; str[i] != '\n'; i++) {
fputc(str[i], fptr);
}
fclose(fptr);
return 0;
}
输出文件 fputc_test.txt 内容:

示例:fputs()
#include <stdio.h>
int main() {
FILE *fp = fopen("fputs_test.txt", "w+");
fputs("This is Guru99 Tutorial on fputs,", fp);
fputs("We don't need to use for loop\n", fp);
fputs("Easier than fputc function\n", fp);
fclose(fp);
return 0;
}
结果文件 fputs_test.txt:

示例:fprintf()
#include <stdio.h>
int main() {
FILE *fptr = fopen("fprintf_test.txt", "w");
fprintf(fptr, "Learning C with Guru99\n");
fclose(fptr);
return 0;
}
结果文件 fprintf_test.txt:

读取文件
三大核心读函数:
fgetc(FILE*)– 返回下一字符fgets(char*, int, FILE*)– 读最多n-1字符到缓冲区fscanf(FILE*, const char*, …)– 解析格式化输入
完整演示:用三种方式读取 fprintf_test.txt:
#include <stdio.h>
int main() {
FILE *fp;
char buffer[50], c;
fp = fopen("fprintf_test.txt", "r");
printf("----read a line----\n");
fgets(buffer, 50, fp);
printf("%s\n", buffer);
fclose(fp);
fp = fopen("fprintf_test.txt", "r");
printf("----read and parse data----\n");
char str1[10], str2[2], str3[20], str4[2];
fscanf(fp, "%s %s %s %s", str1, str2, str3, str4);
printf("Read String1 |%s|\n", str1);
printf("Read String2 |%s|\n", str2);
printf("Read String3 |%s|\n", str3);
printf("Read String4 |%s|\n", str4);
fclose(fp);
fp = fopen("fprintf_test.txt", "r");
printf("----read the entire file----\n");
while ((c = fgetc(fp)) != EOF) {
putchar(c);
}
fclose(fp);
return 0;
}
程序输出:
----read a line---- Learning C with Guru99 ----read and parse data---- Read String1 |Learning| Read String2 |C| Read String3 |with| Read String4 |Guru99| ----read the entire file---- Learning C with Guru99

getc 与 putc 交互式字符 I/O
最小示例:读取用户输入、写入文件、再读回:
#include <stdio.h>
int main() {
FILE *fp;
int c;
printf("File Handling\n");
fp = fopen("demo.txt", "w");
while ((c = getchar()) != EOF) {
putc(c, fp);
}
fclose(fp);
printf("Data Entered:\n");
fp = fopen("demo.txt", "r");
while ((c = fgetc(fp)) != EOF) {
putchar(c);
}
fclose(fp);
return 0;
}
运行示例:


核心要点
- 文件是磁盘上的持久化存储空间
- C 标准库提供
fopen、fclose、fprintf、fscanf等函数可靠操作文件 - 务必以正确模式打开文件,控制读/写/追加行为
- 显式关闭文件以刷新缓冲区、释放系统资源
- 简单字符流用
fgetc/putc,行/格式化输入用fgets/fscanf - 写入时若需换行,记得以
\n结尾 - 健壮应用必须检查
NULL指针与返回值做错误处理
C语言
- I/O 卡深度解析:工作原理、工业级应用与维修价值
- 自制树莓派 I/O 扩展排线与插针适配板:分步图文教程
- Apacer全球首发CV110-SD与CV110-MSD高性能闪存卡
- Apacer 推出 SV250 工业级 SSD:560MB/s 读取、520MB/s 写入
- acceed EDAM-4200 系列:集成 I/O 模块,实现可扩展、可靠的数据通信
- 精通C#变量与基础数据类型:完整指南
- C 语言输入输出(I/O)精通:scanf() 与 printf() 详解
- C语言文件处理完全指南:fopen、fprintf、fread 与 fseek
- C 语言文件 I/O 实战:创建、打开、读写与二进制操作
- C 语言头文件详解:类型、用法与最佳实践
- C++文件I/O完全指南:fstream读写、打开模式、定位指针与完整实例
- Python 文件 I/O:掌握文件操作、读写与管理