C语言文件操作(四) —— 文件读取结束的判定(feof、ferror)

        目录

1、feof、ferror 函数返回值

(1) feof 函数

(2) ferror 函数

2、feof、ferror 函数函数使用


fgetc、fgets的返回值说明都有提到一句话 “调用失败或者文件读取结束时,函数返回EOF”。但是光凭EOF我们也无从知晓,是调用失败还是文件读取结束。

因此,C语言给我们提供了 feof、ferror 函数。这两个函数 一般可以配套使用,一个用来是否读取到文件尾,一个用来判断是否遇到错误(调用失败)。

  • feof:当文件读取结束时,判断是不是遇到文件末尾才结束的
  • ferror:当文件读取结束时,判断是不是遇到错误才读取结束的

1、feof、ferror 函数返回值

两个函数的参数都是 文件指针,这里需要注意的是两个函数的返回值。

(1) feof 函数

函数返回值:如果没有到文件尾,返回0;到达文件尾,返回一个非零值。

(2) ferror 函数

函数返回值:无错误出现时返回0;有错误出现时,返回一个非零值。

 

2、feof、ferror 函数函数使用

FILE* pf = fopen("D:\\data.txt", "r");
if (pf == NULL)
{
	perror("fopen");
	return -1;
}

fgetc(pf);
fgetc(pf);
fgetc(pf);
fgetc(pf);

if (ferror(pf))
{
	printf("读取时出现了IO错误");
}
else if (feof(pf))
{
	printf("成功到达文件尾");
}


fclose(pf);
pf = NULL;
### C语言判定文件指针是否到达末尾的方法 在C语言中,可以通过多种方式来判断文件指针是否已到达文件末尾。常用的方式包括使用`feof()`函数以及通过读取操作的结果来进行间接判断。 #### 使用 `feof()` 函数检测文件末尾 `feof()` 是标准库中的一个宏定义,在 `<stdio.h>` 中声明。此函数用于测试流上的文件结束符(EOF)。如果之前调用输入函数时遇到了文件结束,则该函数返回非零值;否则返回零[^1]。 ```c if (feof(pf)) { printf("End of file reached successfully.\n"); } ``` 需要注意的是,仅当尝试从文件末尾之后的位置读取数据失败后才会设置文件结束标志位。因此通常是在一次不成功的读取操作之后立即检查这个条件。 #### 通过读取操作结果直接判断 另一种常见做法是利用像 `fgetc()` 这样的读取函数返回特定值 (`EOF`) 来表示已经达到了文件末端或发生其他类型的错误情况。例如: ```c int c; while ((c = fgetc(pf)) != EOF) { putchar(c); } if (ferror(pf)) { fprintf(stderr, "Error occurred during reading.\n"); } else if (feof(pf)){ printf("Reached end of file without errors.\n"); } ``` 这里每次循环迭代都试图获取下一个字符并打印出来,一旦遇到 `EOF` 就会退出循环,并进一步区分是因为达到文件末尾还是因为发生了 I/O 错误而终止读取过程[^2]。 对于更复杂的场景下可能还需要考虑清除错误状态以便后续继续处理同一文件或其他资源,这可以借助于 `clearerr()` 函数实现。 #### fseek ftell 的组合应用 除了上述两种基本手段外,还可以采用移动文件指针至指定偏移量再查询当前位置的方式来确认当前是否处于文件尾部附近。具体来说就是先将指针定位到最后面(`SEEK_END`),然后再查看此时相对于起始位置的距离是否等于整个文件长度。 ```c long getFileSize(FILE *fp){ long prev=ftell(fp); /* Save current position */ fseek(fp , 0L , SEEK_END); /* Seek to end of file */ long size=ftell(fp); /* Get the offset from start */ fseek(fp,prev,SEEK_SET); /* Restore original position */ return size; } ``` 这种方法虽然有效但也存在效率方面的问题,特别是在频繁执行此类检查的情况下可能会带来性能开销。 综上所述,最简单可靠的办法通常是依靠读写过程中自然产生的 EOF 或者显式的 feof 测试来完成这一目的。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值