C语言文件操作——判断文件是否结束

文章目录
  • 前言
  • ferror函数
  • feof函数
  • ferror函数和feof函数搭配使用

前言

在《文件操作》章节中,我们介绍过一系列的与文件的顺序读写有关的函数,它们调用成功与失败时的返回值各不相同,为了能更好地记忆这些函数,我们将这些函数的返回值进行了总结,并列入表格:

C语言文件操作——判断文件是否结束_第1张图片

这样一一列举出来后,看似已经非常清楚明了,实际却还有一些小细节:

1. fgetc函数返回EOF时,可能是读取数据时发生错误,也可能是已经读取到文件末尾了。
2. fgets函数返回NULL时,可能是读取数据时发生错误,也可能是已经读取到文件末尾了。
3. fscanf函数返回EOF时,可能是读取数据时发生错误,也可能是在第一次转换之前到达文件流的末尾。
4. fread函数返回的值小于要求读取的完整项的数目时,可能是读取数据时发生错误,也可能是在达到读取的规定数目之前遇到文件结尾。

这些不同的情况返回的却是同一个值,当fgetc函数返回EOF时,我们不能断定一定是读取数据时发生错误了,当fscanf函数返回EOF时,我们也不能断定它就是文件读取结束了。所以,出现了一类函数,它们的功能就是,判断文件操作函数是以一种什么方式结束。

注意:以下介绍的函数的功能不是判断文件操作函数是否调用失败,而是在文件操作函数已经调用失败的情况下,判断文件操作函数调用失败的原因。

ferror函数

int ferror( FILE *stream );

ferror函数的功能就是判断使用某一文件指针的过程中,是否发生错误,若使用时没有发生错误,则ferror函数返回0;否则,ferror函数将返回一个非零的值。调用ferror函数时,我们只需将待检查的文件指针传入即可。

	if (ferror)
	{
		printf("文件指针使用时,发生错误\n");
	}

feof函数

int feof( FILE *stream );

feof函数的功能也是判断使用某一文件指针的过程中,是否读取到文件末尾,若使用时没有读取到文件末尾,则feof函数返回0;否则,feof函数将返回一个非零的值。调用feof函数时,也只需将待检查的文件指针传入即可。

	if (feof(pf))
	{
		printf("文件指针使用时,读取到文件末尾\n");
	}

ferror函数和feof函数搭配使用


当前言中说到的文件操作函数调用失败时,我们就可以同时运用ferror函数和feof函数,来判断文件操作函数调用失败的准确原因。

例如,文件data.txt文件中的数据为"abcdef",我们要用fgetc函数读取data.txt文件中的数据,当数据读取完之后,我们就可以用ferror函数和feof函数,来判断最后一次fgetc函数调用失败的原因:

#include 
#include 
#include 

int main()
{
	//打开文件
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;//文件打开失败,失败返回
	}
	//读取文件中的数据
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c", ch);
	}
	if (ferror(pf))
	{
		printf("文件指针使用时,发生错误而结束\n");
	}
	else if (feof(pf))
	{
		printf("文件指针使用时,读取到文件末尾而结束\n");
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

希望大家能对文件结束判定相关的函数有所认识,对大家学习有所帮助~

我们下期博客再见~
 

你可能感兴趣的:(c语言,开发语言)