文件的打开和关闭


前言

我们已经了解了文件的基本概念,那么我们如何通过代码对某一个文件进行一些操作呢?比如如何打开文件、关闭文件以及如何向文件中写入或是读取数据呢?

在头文件stdio.h中包含了一系列的文件操作函数,以便我们对特定的文件进行相应的操作。学会对文件进行操作后,我们就可以将代码与文件联系起来,这样能让编程变得更有意思不是吗?比如你写了一个数据存储的代码,当程序退出后,数据都会被释放掉,下次需要重新输入,在我们没有接触数据库之前,文件帮我们做到了存储的功能,方便我们下次直接读取。

下面介绍了打开以及关闭文件的操作函数,以及其中的一些细节。

文件打开函数 - fopen

函数介绍

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

该函数的功能就是打开一个文件,函数的第一个参数是你要打开的文件的文件名,第二个参数是打开这个文件的形式。

我们知道打开一个文件时,系统会为该文件创建一个文件信息区,该函数调用完毕后,如果打开该文件成功,那么返回指向该文件信息区的指针(FILE*类型);如果打开文件失败,那么返回一个空指针(NULL)。

文件的打开形式

一、规则
在这里插入图片描述
使用上面的模式说明符,文件将作为文本文件打开。为了将文件作为二进制文件打开,模式字符串中必须包含“b”字符。这个附加的“b”字符可以附加在字符串的末尾(从而形成以下复合模式:“rb”、“wb”、“ab”、“r+b”、“w+b”、“a+b”),也可以插入在“+”符号之前(“rb+”、“wb+”、“ab+”)。
如果序列后面有其他字符,则行为取决于库实现:一些实现可能会忽略其他字符,例如,接受额外的“t”(有时用于显式表示文本文件)。
在某些库实现中,使用更新模式打开或创建文本文件可能会视为二进制文件。
举个几个例子:
1.若我们要以文本形式打开一个名叫data.txt的文件,将要对其进行输入操作,那么打开文件时应该这样写:

FILE* pf = fopen("data.txt", "r");

注:data.txt文件必须存在,不然打开文件失败,fopen函数会返回一个空指针。
2.若我们要以二进制打开一个名叫data.bin的文件,将要对其进行输出操作,那么打开文件时应该这样写:

FILE* pf = fopen("data.bin", "wb");

注:data.bin文件若存在,将销毁文件原有内容,再对其进行输出;data.bin文件若不存在,系统将主动创建一个名叫data.bin的文件。

二、检测fopen返回值的有效性
前面说到,如果文件打开成功,fopen函数会返回指向文件信息区的指针,否则fopen函数会返回一个空指针。所以当使用接收fopen函数的返回值的指针前,我们必须检测其有效性,否则可能非法访问内存
检测有效性:

	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;//失败返回
	}
	//使用...

填写fopen函数的第一个参数的时候,如果我们要打开的文件与我们正在运行的源代码在同级目录下(以打开data.txt文件为例),那么我们应该这样写:

FILE* pf = fopen("data.txt", "r");//同级

但是如果我们想要打开的文件与当前运行的源代码不在同一级目录下呢?
这时我们的写法有两种,相对路径和绝对路径。

相对路径与绝对路径

一、相对路径
当待打开的文件位于正在运行的源代码的上一级时:

FILE* pf = fopen("../data.txt", "r");//上一级

当待打开的文件位于正在运行的源代码的上上级时:

FILE* pf = fopen("../../data.txt", "r");//上上级

当待打开的文件位于正在运行的源代码的下一级时:

FILE* pf = fopen("Debug/data.txt", "r");//下一级

注:这里data.txt文件在Debug文件内,Debug文件与正在运行的源代码在同级目录下。

总结:

1.要打开上级的文件在原来的基础上加上". ./“,再上一级再加一个”. ./",以此类推。
2.要打开下级的文件,就需从源代码这一级开始,写出目标文件的路径。

二、绝对路径
有博友可能觉得相对路径的方法比较麻烦(可能还要去数目标文件与源文件相差的级数),绝对路径就没那么麻烦了,绝对路径就直接写出目标文件的完整路径即可,例如:

FILE* pf = fopen("D:\\code\\File_function\\File_function\\data.txt", "r");

注:文件的路径原本为"D:\code\File_function\File_function\data.txt",但是为了防止字符串中的’\‘及其后面的字符被整体视为为转义字符,所以需要在每个’\‘后面再加一个’\’。

文件关闭函数 - fclose

与动态开辟内存空间时一样,当我们打开文件时,会在内存中开辟一块空间,如果我们打开该文件后不关闭,那么这个空间会一直存在,一直占用那块内存空间,所以当我们对一个文件的操作结束时,一定要记住将该文件关闭。这就需要用到fclose函数来关闭文件。

int fclose( FILE *stream );

我们如果要关闭一个文件,那么直接将该文件的文件指针传入fclose函数即可,fclose函数如果关闭文件成功会返回0。与free函数一样,当我们调用完fclose函数将文件关闭后,我们也要将指向文件信息区的指针置空,避免该指针变成野指针。

	fclose(pf);//关闭pf指向的文件
	pf = NULL;//及时置空

文件操作正确流程

知道了如何打开文件和关闭文件,也就相当于知道了如何进入和如何出去,所以当我们要对一个文件进行操作的时候,正确的流程应该是这样的:

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
	//打开文件
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)//检测指针有效性
	{
		printf("%s\n", strerror(errno));//错误提醒
		return 1;//失败返回
	}

	//对文件进行一系列操作
	//...

	//关闭文件
	fclose(pf);关闭pf指向的文件
	pf = NULL;//及时置空
	return 0;
}
在 C 语言中,打开文件关闭文件是操作文件的两个重要步骤。通过打开文件,我们可以读取文件的内容或将数据写入文件中;通过关闭文件,我们可以释放文件占用的资源,确保文件操作的安全性。 文件打开关闭都需要使用到 C 语言标准库中的文件操作函数,例如 `fopen` 和 `fclose`。下面分别介绍这两个函数的使用方法和注意事项。 ## 打开文件 在 C 语言中,使用 `fopen` 函数打开文件。`fopen` 函数的原型如下: ```c FILE *fopen(const char *filename, const char *mode); ``` 其中,`filename` 是要打开文件名,`mode` 是文件打开模式。`fopen` 函数返回一个指向 `FILE` 结构体的指针,该结构体包含了有关文件的信息。 `mode` 参数可以取以下值中的一种或多种: - "r":以只读模式打开文件文件必须存在。 - "w":以写入模式打开文件,如果文件不存在则创建文件,如果文件已经存在则清空文件内容。 - "a":以追加模式打开文件,如果文件不存在则创建文件。 - "rb"、"wb"、"ab":以二进制模式打开文件,可以与上述模式组合使用,例如 "rb+" 表示以读写模式打开二进制文件。 例如,以下代码以只读模式打开名为 `example.txt` 的文件: ```c FILE *fp = fopen("example.txt", "r"); ``` 如果文件打开成功,`fopen` 函数将返回一个指向 `FILE` 结构体的指针;如果文件打开失败,`fopen` 函数将返回 `NULL`。 ## 关闭文件 在 C 语言中,使用 `fclose` 函数关闭文件。`fclose` 函数的原型如下: ```c int fclose(FILE *stream); ``` 其中,`stream` 是指向 `FILE` 结构体的指针。`fclose` 函数返回一个整数值,表示文件是否关闭成功。如果成功关闭文件,`fclose` 函数将返回 0;如果关闭文件失败,`fclose` 函数将返回一个非 0 的值。 例如,以下代码关闭先前打开文件: ```c int result = fclose(fp); if (result == 0) { printf("文件关闭成功!\n"); } else { printf("文件关闭失败!\n"); } ``` 需要注意的是,如果在操作文件之前打开文件失败,或者在操作文件之后关闭文件失败,都会导致程序出错。因此,我们需要在打开文件关闭文件进行错误处理,确保操作文件的安全性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值