![](https://i-blog.csdnimg.cn/blog_migrate/329ae08ce87ed6d76582d304e0b62622.gif)
第10章 对文件的输入输出
10.2 打开与关闭文件
在进行文件读写之前,应该先“打开”文件,在使用结束之后应“关闭”文件。“打开”和“关闭”是形象的说法,就像打开门才能进入房子,关闭门就无法进入一样。实际上,所谓“打开”是指为文件建立相应的信息区(用来存放有关文件的信息)和文件缓冲区(用来暂时存放输入输出的数据)。在编写程序时,在打开文件的同时,一般都指定一个指针变量指向该文件,也就是建立起指针变量与文件之间的联系,这样就可以通过该指针变量对文件进行读写。所谓“关闭”是指撤销文件信息区和文件缓冲区,使文件指针变量不再指向该文件,从而无法进行对文件的读写。
10.2.1 用 fopen
函数打开数据文件
ANSI C规定了用标准输入输出函数 fopen
来实现打开文件。fopen
函数的调用方式为:
FILE *fopen(const char *filename, const char *mode);
例如:
FILE *fp;
fp = fopen("a1.txt", "r");
表示要打开名字为 a1.txt
的文件,使用文件方式为“读入”(r
代表 read,即读入)。fopen
函数的返回值是指向 a1.txt
文件的指针(即 a1.txt
文件信息区的起始地址)。通常将 fopen
函数的返回值赋给一个指向文件的指针变量。
文件使用方式
表 10.1 使用文件方式:
文件使用方式 | 含义 | 如果指定的文件不存在 |
---|---|---|
"r" | 为了输入数据,打开一个已存在的文本文件 | 出错 |
"w" | 为了输出数据,打开一个文本文件 | 建立新文件 |
"a" | 向文本文件尾添加数据 | 出错 |
"rb" | 为了输入数据,打开一个二进制文件 | 出错 |
"wb" | 为了输出数据,打开一个二进制文件 | 建立新文件 |
"ab" | 向二进制文件尾添加数据 | 出错 |
"r+" | 为了读和写,打开一个文本文件 | 出错 |
"w+" | 为了读和写,建立一个新的文本文件 | 建立新文件 |
"a+" | 为了读和写,打开一个文本文件 | 出错 |
"rb+" | 为了读和写,打开一个二进制文件 | 出错 |
"wb+" | 为了读和写,建立一个新的二进制文件 | 建立新文件 |
"ab+" | 为了读和写,打开一个二进制文件 | 出错 |
例子1:打开一个文件并检查是否成功
编写一个C程序,打开一个文件并检查是否成功:
#include <stdio.h>
int main() {
FILE *fp;
if ((fp = fopen("example.txt", "r")) == NULL) {
printf("Cannot open this file\n");
return 1;
}
// 进行文件操作
fclose(fp); // 关闭文件
return 0;
}
理解与应用
打开文件的主要目的是为文件读写建立通道,而关闭文件则是撤销这个通道以释放资源。在编写文件操作程序时,必须确保文件被正确打开和关闭,否则可能会导致数据丢失或资源泄漏。
例子2:使用不同模式打开文件
编写一个C程序,演示如何使用不同模式打开文件:
#include <stdio.h>
int main() {
FILE *fp;
// 以只读模式打开文件
fp = fopen("example.txt", "r");
if (fp == NULL) {
printf("Cannot open file in read mode\n");
} else {
printf("File opened in read mode\n");
fclose(fp);
}
// 以写模式打开文件
fp = fopen("example.txt", "w");
if (fp == NULL) {
printf("Cannot open file in write mode\n");
} else {
printf("File opened in write mode\n");
fclose(fp);
}
// 以追加模式打开文件
fp = fopen("example.txt", "a");
if (fp == NULL) {
printf("Cannot open file in append mode\n");
} else {
printf("File opened in append mode\n");
fclose(fp);
}
return 0;
}
小结
理解和正确使用文件打开和关闭操作是C语言文件处理的基础。通过选择合适的文件模式,可以实现不同的文件操作需求。确保文件被正确关闭可以防止资源泄漏,保证程序的健壮性和可靠性。
10.2.2 用 fclose
函数关闭数据文件
在使用完一个文件后应该关闭它,以防止它再被误用。所谓“关闭”就是撤销文件信息区和文件缓冲区,使文件指针变量不再指向该文件,也就是文件指针变量与文件“脱钩”,此后不能再通过该指针对原来与其相联系的文件进行读写操作,除非再次打开,使该指针变量重新指向该文件。
使用 fclose
函数关闭文件
fclose
函数的调用一般形式为:
int fclose(FILE *stream);
例如:
FILE *fp;
fp = fopen("example.txt", "r");
// 使用文件进行读写操作
fclose(fp);
前面我们将打开文件时 fopen
函数返回的指针赋给了 fp
,现在用 fclose
函数关闭 fp
指向的文件,此后 fp
不再指向该文件。
理解与应用
如果不关闭文件就结束程序运行,可能会丢失数据。因为在向文件写数据时,是先将数据输出到缓冲区,待缓冲区充满后才正式输出给文件。如果程序在缓冲区未充满时结束运行,就有可能导致缓冲区中的数据丢失。用 fclose
函数关闭文件时,会先把缓冲区中的数据输出到磁盘文件,然后才撤销文件信息区。有些编译系统在程序结束前会自动将缓冲区中的数据写到文件,从而避免数据丢失,但我们还是应当养成在程序终止之前关闭所有文件的习惯。
fclose
函数返回一个值,当成功地执行了关闭操作时,返回值为0;否则返回EOF(-1)。
实际应用中的例子
例子3:正确关闭文件
编写一个C程序,演示如何正确关闭文件,并检查关闭操作是否成功:
#include <stdio.h>
int main() {
FILE *fp;
fp = fopen("example.txt", "r");
if (fp == NULL) {
printf("Cannot open this file\n");
return 1;
}
// 进行文件操作
if (fclose(fp) != 0) {
printf("Error closing file\n");
} else {
printf("File closed successfully\n");
}
return 0;
}
小结
正确关闭文件是确保数据完整性和防止资源泄漏的重要步骤。使用 fclose
函数可以确保缓冲区中的数据被正确写入文件并释放资源,保证程序的稳定运行。在编写涉及文件操作的程序时,养成良好的关闭文件的习惯是非常重要的。
![](https://i-blog.csdnimg.cn/blog_migrate/64335c937c9dafcabd46ddfce58ab270.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6e7d6b4fc84743896b08e7ab10a7c812.png)