文件读取结束的判定

1.被错误使用的feof

返回值读取到被设置的文件结束指示符(EOF)的情况下,返回非零值。否则,返回零。 

当我们打开一个流的时候,流上有两个标记值:

1.是否遇到文件结尾产生标记

2.是否发生错误产生标记

注意:在文件读取过程中不能用feof函数的返回值直接判断文件的读取是否结束! 

feof 的作用:在文件读取已经结束的基础上,判断文件读取结束的原因是否是遇到文件末尾而结束(检测相应的标记)。

ferror 的作用:在文件读取已经结束的基础上,用来判断文件读取结束的原因是否是遇到错误而结束(检测相应的标记)。 


EOF

EOF为 End Of File 的缩写,通常在文本的最后表示资料结束。EOF 的值通常为 -1,当程序读取它的时候,就会知道文件已经到达结尾。通常使用while循环加EOF判断作为读取结束的标志。 

文本文件读取是否结束,判断返回值是否为 EOF ( fgetc ),或者 NULL ( fgets ) 例如:

  • fgetc 判断是否为 EOF(读取正常,返回读取到字符的ASCII码值;读取过程中发生错误或遇到文件末尾,返回EOF) 。
  • fgets 判断返回值是否为 NULL (读取正常,返回存储字符串的字符数组的地址;读取过程中发生错误或遇到文件末尾,返回NULL)。

二进制文件读取是否结束,判断返回值是否小于实际要读的个数。例如:fread 

feof 返回非零的关键在于当文件指针到达文件末尾仍然试图再向下读取的时候,文件结束指示符(EOF)可能才被设置,然后再调用feof(),才会得到文件结束的信息,通常和ferror搭配使用。

2.正确使用feof 

举例:

#include <stdio.h>
int main()
{
	FILE* pf=fopen("test.txt", "r");
	if (pf ==NULL)
	{
		perror("fopen");
		return 1;
	}
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c ", ch);
	}
	printf("\n");
	//判断是什么原因导致读取结束的
	if (feof(pf))
	{
		printf("遇到文件末尾,读取正常结束\n");
	}
	else if (ferror(pf))
	{
		perror("fgetc");//错误原因
	}
	return 0;
}

运行结果:


3.小练习 

尝试写一段代码完成下面任务:

将test1.txt文件的内容拷贝到test2.txt文件中。

新建test1.txt文件如下:

举例: 

#include<stdio.h>
int main()
{   
	FILE* pfin = fopen("test1.txt", "r");
	if (pfin ==NULL)
	{
		perror("fopen test1.txt");
		return 1;
	}
	FILE* pfout=fopen("test2.txt", "w");
	if (pfout ==NULL)
	{
		fclose(pfin);//既然pfout文件打开失败,无法完成拷贝任务,pfin文件也应关闭
		perror("fopen test2.txt");
		return 1;
	}
	//读文件和写文件
	int ch = 0;
	while ((ch = fgetc(pfin)) != EOF)
	{
		fputc(ch, pfout);   //读一个写一个
	}
	//关闭文件
	fclose(pfin);
	pfin = NULL;
	fclose(pfout);
	pfout = NULL;
	return 0;
}

运行结果:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值