<stdio.h> 是 C 语言里最常用的标准头文件之一,很多程序的输入输出、文件读写都会从这里开始。若你刚接触文件操作,最容易混淆的往往不是语法本身,而是“先打开、再读写、最后关闭”和“出错时如何判断”这两条主线。本文按这个顺序整理 stdio.h 里最常见的几个函数,帮助你快速判断每个函数该在什么场景下使用。
stdio.h 在文件输入输出里负责什么
在文件操作场景中,<stdio.h> 主要提供三类能力:
- 打开和关闭文件,例如
fopen()、fclose(); - 按格式写入和读取内容,例如
fprintf()、fscanf(); - 在操作失败时输出错误信息,例如
perror()。
理解这几类函数之后,基本就能覆盖简单的文本文件读写流程。
如何打开和关闭文件
fopen():先拿到文件指针
fopen() 用于打开指定文件,并返回一个指向 FILE 类型的指针。后续无论读取还是写入,通常都要先拿到这个指针。

函数原型:
FILE *fopen(const char *filename, const char *mode);
参数说明:
filename:要打开的文件名。mode:文件打开方式,例如"r"表示只读,"w"表示写入并覆盖原内容,"a"表示追加到文件末尾。
返回值:
- 成功时,返回指向
FILE的指针。 - 失败时,返回
NULL。
这里最关键的一步,是在调用后立即判断返回值是否为 NULL。如果打开失败,后续读写都不应该继续执行。
示例代码:
// www.ja vascriptcn.com code example
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("example.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
// 进行读取操作
fclose(fp); // 关闭文件
return 0;
}
fclose():操作结束后及时关闭
fclose() 用于关闭由 fopen() 打开的文件。文件关闭不仅是资源释放问题,也关系到缓冲区内容是否被正确写回。
函数原型:
int fclose(FILE *stream);
参数说明:
stream:要关闭的文件指针。
返回值:
- 成功时,返回
0。 - 失败时,返回
EOF。
很多初学者会把重点全放在读写函数上,但从实际使用看,文件成功打开后能否被正常关闭,同样值得关注。
示例代码:
// www.ja vascriptcn.com code example
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("example.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
// 进行读取操作
fclose(fp); // 关闭文件
return 0;
}
文件内容怎么写入和读取
fprintf():向文件写入格式化内容
fprintf() 的用法与 printf() 很接近,区别在于它把格式化结果写入文件,而不是输出到终端。

函数原型:
int fprintf(FILE *stream, const char *format, ...);
参数说明:
stream:指向文件的指针。format:输出格式字符串。...:可变参数列表。
返回值:
- 成功时,返回写入的字符数。
- 失败时,返回负值。
它适合输出有固定格式的文本内容,例如日志、配置数据或简单报表。
示例代码:
// www.ja vascriptcn.com code example
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("output.txt", "w");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
fprintf(fp, "Hello, World!n");
fclose(fp);
return 0;
}
fscanf():按格式从文件读取数据
fscanf() 则可以理解为文件版的 scanf(),用于从文件中读取符合指定格式的数据。
函数原型:
int fscanf(FILE *stream, const char *format, ...);
参数说明:
stream:指向文件的指针。format:输入格式字符串。...:可变参数列表。
返回值:
- 成功时,返回读取的数据项数。
- 遇到文件结束或错误时,返回
EOF。
实际使用时,应特别关注返回值,因为它能帮助你判断是否真的读到了预期数量的数据项。
示例代码:
// www.ja vascriptcn.com code example
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("input.txt", "r");
if (fp == NULL) {
perror("Error opening file");
return -1;
}
int number;
fscanf(fp, "%d", &number);
printf("Read number: %dn", number);
fclose(fp);
return 0;
}
文件操作失败时如何处理错误
perror():直接输出可读的错误原因
当 fopen() 或其他文件操作失败时,perror() 可以把错误信息打印到标准错误输出。它通常和返回值判断一起使用,是定位问题最直接的办法之一。

函数原型:
void perror(const char *s);
参数说明:
s:自定义的错误提示字符串。
例如文件不存在、权限不足、路径错误等问题,都可以通过这类方式快速暴露出来。
示例代码:
// www.ja vascriptcn.com code example
#include <stdio.h>
#include <errno.h>
int main() {
FILE *fp;
fp = fopen("nonexistent.txt", "r");
if (fp == NULL) {
perror("Error opening file");
}
return 0;
}
掌握 stdio.h 文件操作时应重点记住什么
如果只抓核心流程,可以把 <stdio.h> 里的文件操作理解成一条固定链路:先用 fopen() 打开文件,确认返回值有效;再根据需求用 fprintf() 或 fscanf() 进行写入和读取;最后通过 fclose() 关闭文件;若中途失败,则用 perror() 输出错误信息。
这几个函数本身并不复杂,真正重要的是形成稳定的使用习惯:打开后先判空、读写时看返回值、结束后记得关闭。把这几个动作做扎实,后续再学习更复杂的文件处理函数时会轻松很多。









