c语言eof_C语言 技能提升 系列文章(十)错误处理

135193a3e06f9a5aa5386d9bf2566ddd.png

在读写文件时,犯什么错误。这是很常见的,今天咱们就来看看C语言是如何处理这些文件读写错误的。

int feof ( FILE * stream );

这个API的作用是检查文件的EOF(end-of-file)指示符是否有效。如果,返回值是一个非零值,则EOF有效。

这个EOF指示符的有效,通常是由于前一次操作访问了文件末尾或者更往后的内存空间。

这里有一点需要注意,虽然文件的读写指针可能已经指向了文件末尾,但是,只要用户不去访问它,EOF指示符就是无效的。

EOF指示符可以被clearerr, rewind, fseek, fsetpos, freopen这些API清楚。当下一次访问出错时,EOF会被自动设置为有效。

int ferror ( FILE * stream );

这个API的作用是检查stream的错误指示符是否有效,如果有效,就返回一个非零的返回值。

错误指示符通常是由于上一次文件错做失败而导致被设置成有效的。

通过调用 clearerr, rewind, freopen就可以将其无效化。

void clearerr ( FILE * stream );

这个API的作用是将 EOF指示符 和 错误指示符 无效化。

当然了,上面也提到了,rewind, fseek, fsetpos, freopen也有可以做到同样的事情。

void perror ( const char * str );

这个API可以打印错误信息。过程就是,先把解析errno,生成一个描述信息字符串,然后再把参数中的字符串接在后面,生成一条完整的错误信息字符串,并输出到stderr中。

errno其实是一个整形变量,它的值代表了错误发生的条件和一些诊断信息。不同的编译器和操作系统对它的值的定义会有少许的不同,大家可以参考对应的文档。但是,一些比较小的值,在不同环境下,还是可以通用的,比如1~20.

perror应该在错误发生后,立刻被调用,不然的话,有可能被后续发生的错误覆盖。

示例代码

#include int main (){  FILE * pFile;  pFile=fopen ("unexist.ent","rb");  if (pFile==NULL)    perror ("The following error occurred");  else    fclose (pFile);  return 0;}
#include int main (){  FILE * pFile;  pFile = fopen("myfile.txt","r");  if (pFile==NULL) perror ("Error opening file");  else {    fputc ('x',pFile);    if (ferror (pFile)) {      printf ("Error Writing to myfile.txt");      clearerr (pFile);    }    fgetc (pFile);    if (!ferror (pFile))      printf ("No errors reading myfile.txt");     fclose (pFile);  }  return 0;}
#include int main (){  FILE * pFile;  int n = 0;  pFile = fopen ("myfile.txt","rb");  if (pFile==NULL) perror ("Error opening file");  else  {    while (fgetc(pFile) != EOF) {      ++n;    }    if (feof(pFile)) {      puts ("End-of-File reached.");      printf ("Total number of bytes read: %d", n);    }    else puts ("End-of-File was not reached.");    fclose (pFile);  }  return 0;}

这就是今天的内容,欢迎大家评论区讨论。

如果对大家有用的话,就请加转发+关注。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值