fclose() 是什么?
fclose() 是 C 标准库 <stdio.h> 中的一个函数,用于关闭一个之前通过 fopen() 打开的文件流。

当您完成对一个文件的所有读写操作后,必须调用 fclose() 来关闭它,这不仅仅是一个好的编程习惯,而且在很多情况下是至关重要的。
函数原型
您可以在头文件 <stdio.h> 中找到它的原型:
int fclose(FILE *stream);
参数
stream: 这是一个指向FILE对象的指针,这个指针通常是由fopen()函数成功打开文件后返回的,如果您尝试关闭一个未打开的文件或传递一个NULL指针,会导致程序错误。
返回值
fclose() 函数会返回一个整数值,用来指示关闭操作是否成功:
0: 表示文件成功关闭,这是您期望的正常返回值。EOF(通常定义为 -1): 表示文件关闭失败,失败的原因可能包括磁盘已满、发生 I/O 错误等。
最佳实践:在调用 fclose() 后,最好检查其返回值,以确保文件已正确关闭。

为什么必须使用 fclose()?
忘记关闭文件可能会导致一系列严重问题:
-
数据丢失:这是最重要也最常见的问题,当您向文件写入数据时,数据通常首先被存放在一个叫做缓冲区 的内存区域,当缓冲区满了或者程序正常结束时,数据才会被真正写入到磁盘文件中,如果您在数据全部写入缓冲区之前就退出了程序,而没有调用
fclose(),那么缓冲区中剩余的数据就会丢失。fclose()会确保所有缓冲区的数据都被刷新并写入文件。 -
系统资源泄漏:操作系统可以同时打开的文件数量是有限的,每个打开的文件都会消耗一个文件描述符 这样的系统资源,如果您的程序打开了大量文件但没有关闭它们,就会耗尽系统的文件描述符资源,导致后续的文件操作失败,甚至可能导致整个程序或系统不稳定。
-
文件锁定问题:在某些操作系统上,一个打开的文件可能会被锁定,防止其他程序同时写入它,如果您的程序没有正确关闭文件,这个锁定可能会一直存在,导致其他程序无法访问该文件。
代码示例
下面是一个完整的示例,演示了如何正确地打开、写入、关闭文件,并检查返回值。
#include <stdio.h>
#include <stdlib.h> // 用于 exit() 函数
int main() {
// 1. 定义一个指向 FILE 结构的指针
FILE *fp;
// 2. 使用 fopen() 打开文件
// "w" 表示以写入模式打开文件,如果文件不存在,则创建;如果存在,则清空内容。
fp = fopen("mydata.txt", "w");
// 3. 检查文件是否成功打开
if (fp == NULL) {
perror("Error opening file"); // perror 会打印出描述性错误信息
return EXIT_FAILURE; // 返回非零值表示程序异常终止
}
// 4. 向文件中写入数据
fprintf(fp, "Hello, C Language!\n");
fprintf(fp, "This is a test for fclose().\n");
// 5. 使用 fclose() 关闭文件,并检查返回值
if (fclose(fp) != 0) {
perror("Error closing file");
return EXIT_FAILURE;
}
printf("File 'mydata.txt' written and closed successfully.\n");
return EXIT_SUCCESS; // 返回 0 表示程序正常终止
}
代码解释:
#include <stdio.h>: 包含了FILE,fopen,fprintf,fclose,perror等函数的定义。FILE *fp;: 声明一个文件指针。fp = fopen("mydata.txt", "w");: 尝试以写入模式("w")打开文件。fopen返回一个指向文件流的指针,如果失败则返回NULL。if (fp == NULL): 错误检查,这是必不可少的一步,因为fopen可能会因为文件路径错误、权限不足等原因失败。fprintf(fp, ...): 向fp指向的文件流中格式化写入字符串。if (fclose(fp) != 0): 关闭文件并检查返回值,这是一个健壮的编程习惯,可以确保我们知晓文件操作是否真的成功完成。perror(): 这是一个非常有用的函数,它会打印出您传入的字符串,然后加上一个冒号和系统最新的错误信息("Error opening file: No such file or directory")。
特殊情况:fclose(stdin), fclose(stdout), fclose(stderr)
标准输入 (stdin)、标准输出 (stdout) 和标准错误 (stderr) 也是文件流,它们在程序启动时由系统自动打开。
- 理论上:您也可以关闭它们。
- 实际上:强烈不建议关闭它们,关闭
stdin会导致后续的scanf,getchar等输入函数行为异常;关闭stdout会导致printf等输出函数无法工作,这些是程序与外界交互的基本通道。
| 特性 | 描述 |
|---|---|
| 功能 | 关闭一个由 fopen 打开的文件流。 |
| 原型 | int fclose(FILE *stream); |
| 参数 | FILE* 指针,指向要关闭的文件流。 |
| 返回值 | 成功返回 0,失败返回 EOF (通常是 -1)。 |
| 重要性 | 至关重要,防止数据丢失、避免系统资源泄漏。 |
| 最佳实践 | 始终检查 fopen 和 fclose 的返回值,以进行错误处理。 |
fopen 和 fclose 就像是一对“括号”,fopen 开启了一个文件操作区域,fclose 则负责安全地结束它,缺少 fclose 的文件操作是不完整的、危险的。
