网络

教育改变生活

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 938|回复: 0
打印 上一主题 下一主题

【C语言】feof和ferror函数

[复制链接]

686

主题

693

帖子

3101

积分

版主

Rank: 7Rank: 7Rank: 7

积分
3101
跳转到指定楼层
楼主
发表于 2024-12-9 13:13:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
fgetc(或者getc)函数返回 EOF 并不一定就表示文件结束,读取文件出错时也会返回 EOF。即 EOF 宏不但能够表示读到了文件结尾这一状态,而且还能表示 I/O 操作中的读、写错误以及其他一些关联操作的错误状态。很显然,仅凭返回 EOF(-1) 就认为文件结束显然是不正确的。

也正因为如此,我们需要使用 feof 函数来替换 EOF 宏检测文件是否结束。当然,在用 feof 函数检测文件是否结束的同时,也需要使用 ferror 函数来检测文件读取操作是否出错,当 ferror 函数返回为真时就表示有错误发生。在实际的程序中,应该每执行一次文件操作,就用 ferror 函数检测是否出错。

其中,文件结束检测函数 feof 的一般原型如下:
int feof(FILE *fp);
值得注意的是,函数 feof 只用于检测流文件,当文件内部位置指针指向文件结束时,并未立即置位 FILE 结构中的文件结束标记,只有再执行一次读文件操作,才会置位结束标志,此后调用 feof 才会返回为真。看下面的示例代码:
  • int main(void)
  • {
  •     FILE *fp=NULL;
  •     char c;
  •     fp=fopen("myfile.txt","r");
  •     if(fp == NULL)
  •     {
  •         printf("不能够访问该文件.\n");
  •         exit(1);
  •     }
  •     while(!feof(fp))
  •     {
  •         c = fgetc(fp);
  •         printf("%c:\t%x\n",c,c);
  •     }
  •     fclose(fp);
  •     fp=NULL;
  • }


这里假设“myfile.txt”文件中存储的是“ABCDEF”,从表面上看,该示例代码的输出结果应该是“ABCDEF”。但实际情况并非如此,你会发现最终输出结果会多输出一个结束字符EOF(这里的 EOF 是 fgetc 函数的返回值,并不是文件中存在的 EOF),运行结果如图 1 所示。


图 1 示例代码的运行结果(Microsoft Visual Studio 2010)


因此,为了解决上述情况,需要在“while(!feof(fp))”循环语句中加以判断,如下面的代码所示:
  • int main(void)
  • {
  •     FILE *fp=NULL;
  •     char c;
  •     fp=fopen("myfile.txt","r");
  •     if(fp == NULL)
  •     {
  •         printf("不能够访问该文件.\n");
  •         exit(1);
  •     }
  •     while(!feof(fp))
  •     {
  •         c=fgetc(fp);
  •         if(c!=-1)
  •         {
  •             printf("%c:\t%x\n",c,c);
  •         }
  •     }
  •     fclose(fp);
  •     fp=NULL;
  • }


当然,也可以采用下面的这种方式进行判断:
  • while(true)
  • {
  •     c=fgetc(fp);
  •     if(feof(fp))
  •     {
  •         break;
  •     }
  •     printf("%c:\t%x\n",c,c);
  • }


或者采用如下形式:
  • c = fgetc(fp);
  • while(!feof(fp))
  • {
  •     printf("%c:\t%x\n",c,c);
  •     c = fgetc(fp);
  • }


不论采用上述 3 种方式的哪一种,都能够得到如图 2 所示的正确结果。


图 2 示例代码的运行结果(Microsoft Visual Studio 2010)


正如上面所阐述的,在使用 feof 函数检测文件是否结束的同时,还需要使用 ferror 函数来检测文件读取操作是否出错,当 ferror 函数返回为真时就表示有错误发生。如下面的示例代码所示:
  • while(!feof(fp))
  • {
  •     if(ferror(fp))
  •     {
  •         perror("error");
  •         break;
  •     }
  •     c=fgetc(fp);
  •     if(c!=-1)
  •     {
  •         printf("%c:\t%x\n",c,c);
  •     }
  • }


除此之外,最后还需要调用 clearerr 函数来清除文件出错标志和文件结束标志,将其置为 0。如下面的示例代码所示:
  • if(ferror(fp))
  • {
  •     clearerr(fp);
  •     /*************/
  • }




回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

WEB前端

QQ|手机版|小黑屋|金桨网|助学堂  咨询请联系站长。

GMT+8, 2024-12-22 09:44 , Processed in 0.035261 second(s), 21 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表