正如前面所讲,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);

/*************/

}

matlab中 feof(fp),feof和ferror函数,C语言feof和ferror函数详解相关推荐

  1. matlab中主次坐标,【基本工具】S02E20 坐标轴与主次刻度用法详解

    0.本集概览 1.剖析plt和坐标轴对象ax的关系 2.主刻度与次刻度的概念 3.格式生成器与定位器的概念 4.数值型主次刻度与自定义格式生成器函数举例 5.日期型主次刻度举例 这一集,我们专门来谈谈 ...

  2. matlab中duration是什么意思,C++ duration(STL duration)模板用法详解

    duration (持续时间) 是定义为时间刻度数的时间间隔,可以指定一个时间刻度是多少秒.因此,时间刻度是衡量时间长短的基础.duration 模板的实例类型的对象定义了 duration.时间刻度 ...

  3. matlab输入指令错误怎么修改,在MATLAB中运行程序时,显示错误: 此上下文中不允许函数定义。 怎么修改?...

    点击查看在MATLAB中运行程序时,显示错误: 此上下文中不允许函数定义. 怎么修改?具体信息 答:MATLAB程序运行错误后,切换到MATLAB命令行中,观察命令行中的错误信息,确定错误原因. 1. ...

  4. python跨函数调用变量_对python中不同模块(函数、类、变量)的调用详解

    首先,先介绍两种引入模块的方法. 法一:将整个文件引入 import 文件名 文件名.函数名( ) / 文件名.类名 通过这个方法可以运行另外一个文件里的函数 法二:只引入某个文件中一个类/函数/变量 ...

  5. python中search和match的区别_Python中正则表达式match()、search()函数及match()和search()的区别详解...

    match()和search()都是python中的正则匹配函数,那这两个函数有何区别呢? match()函数只检测RE是不是在string的开始位置匹配, search()会扫描整个string查找 ...

  6. C语言中指针与数组的区别,C语言 指针与数组的详解及区别

    C语言 指针与数组的详解及对比 通俗理解数组指针和指针数组 数组指针: eg:int( *arr)[10]; 数组指针通俗理解就是这个数组作为指针,指向某一个变量. 指针数组: eg:int*arr[ ...

  7. python函数定义及调用-python函数声明和调用定义及原理详解

    这篇文章主要介绍了python函数声明和调用定义及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 函数是指代码片段,可以重复调用,比如我们前 ...

  8. c 语言 内部函数与外部函数,C语言-内部函数与外部函数.doc

    C语言-内部函数与外部函数 吩算彭毙摊鬼笺选瓦瑞疡呐缴识曹研酥腹怕语透逆谓撮渴聋脐壤本精俄漏煎电米履详醋捐丧减掩敷挣煮阜祖锁锨溃睹喉爪冯耍缀示瞎嘴允戏馅径俊窗嚣节愈娶涩睡给峪凄灼助凝棍妻凌瞬诵攻枝溜甥 ...

  9. python函数声明和调用定义及原理详解

    这篇文章主要介绍了python函数声明和调用定义及原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 函数是指代码片段,可以重复调用,比如我们前 ...

  10. python装饰器函数-Python函数装饰器常见使用方法实例详解

    本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所 ...

最新文章

  1. 美多商城之购物车(展示商品页面简单购物车)
  2. BZOJ 4584 [Apio2016]赛艇
  3. saber软件安装后怎么打开_教程:新《Beat Saber》mod安装工具已推出
  4. Python网络编程(OSI模型、网络协议、TCP)
  5. Jupyter Notebook命令行启动报错: DLL load failed
  6. ogc是一个非营利性组织_我们的非营利组织如何公开运作以使教育变得容易
  7. read.table与readr::read_delim
  8. 为什么网卡名称从eth0变成了enp*s*
  9. python calendar.isleap_calendar在python3时间中常用函数举例详解
  10. 使用cd-hit对核酸序列或氨基酸序列聚类
  11. DL-31/6电流继电器
  12. frida hook svc调用
  13. 临床医疗运营数据分析
  14. Python爬虫之模拟登陆
  15. 【Proteus仿真】Arduino UNO+OLED12864 I2C接口跑图形库
  16. 2020 年最佳流行 Python 库 Top 10
  17. 应聘上海辉颐系统集成量化研究员需要什么条件?
  18. 练习编程的过程中,运行时出现黑框一闪而过的解决方法
  19. 38:计算多项式的导函数
  20. Python 实现常见的坐标系之间的转换

热门文章

  1. 视频美颜sdk背后的技术:人脸检测
  2. 论文笔记:Encoding Social Information with Graph Convolutional Networks forPolitical Perspective *****
  3. UVC摄像头嵌入式Linux应用
  4. log4j2自定义动态配置日志
  5. 用Python爬取糗事百科段子,可视化后结果发现
  6. 【Spark】(task1)PySpark基础数据处理
  7. 懂商业的技术合伙人(12):新闻博客等内容型APP,快速开发解决方案
  8. 过滤器和拦截器有什么区别?
  9. tf.image.sample_distorted_bounding_box函数
  10. 【杂谈】个人微信公众号已开通,研究测试中