当前位置: 首页 > news >正文

检查或复位状态[ feof()函数、ferror()函数和clearerr()函数 ]

调用 fread()读取数据时,如果返回值小于参数 nmemb 所指定的值,表示发生了错误或者已经到了文件
末尾(文件结束 end-of-file),但 fread()无法具体确定是哪一种情况;在这种情况下,可以通过判断错误标志或 end-of-file 标志来确定具体的情况。

1. feof()函数

库函数 feof()用于测试参数 stream 所指文件的 end-of-file 标志,如果 end-of-file 标志被设置了,则调用feof()函数将返回一个非零值,如果 end-of-file 标志没有被设置,则返回 0。
其函数原型如下所示:

#include <stdio.h>
int feof(FILE *stream);

当文件的读写位置移动到了文件末尾时,end-of-file 标志将会被设置。

if (feof(file)) 
{
	/* 到达文件末尾 */
}
else 
{
	/* 未到达文件末尾 */
}

2. ferror()函数

库函数 ferror()用于测试参数 stream 所指文件的错误标志,如果错误标志被设置了,则调用 ferror()函数将返回一个非零值,如果错误标志没有被设置,则返回 0。
其函数原型如下所示:

#include <stdio.h>
int ferror(FILE *stream);

当对文件的 I/O 操作发生错误时,错误标志将会被设置。

if (ferror(file)) 
{
	/* 发生错误 */
}
else 
{
	/* 未发生错误 */
}

3. clearerr()函数

库函数 clearerr()用于清除 end-of-file 标志和错误标志,当调用 feof()或 ferror()校验这些标志后,通常需要清除这些标志,避免下次校验时使用到的是上一次设置的值,此时可以手动调用 clearerr()函数清除标志。
clearerr()函数原型如下所示:

#include <stdio.h>
void clearerr(FILE *stream);

此函数没有返回值,调用将总是会成功!
对于 end-of-file 标志,除了使用 clearerr()显式清除之外,当调用 fseek()成功时也会清除文件的 end-of-file 标志。

clearerr()函数使用示例

#include <stdio.h>
#include <stdlib.h>

int main(void) 
{
	 FILE *fp = NULL;
	 char buf[20] = {0};
	 
	 /* 打开文件 */
	 if (NULL == (fp = fopen("./testApp.c", "r"))) 
	 {
		 perror("fopen error");
		 exit(-1);
	 }
	 printf("文件打开成功!\n");
	 
	 /* 将读写位置移动到文件末尾 */
	 if (0 > fseek(fp, 0, SEEK_END)) 
	 {
		 perror("fseek error");
		 fclose(fp);
		 exit(-1);
	 }
	 
	 /* 读文件 */
	 if (10 > fread(buf, 1, 10, fp)) 
	 {
		 if (feof(fp))
		 printf("end-of-file 标志被设置,已到文件末尾!\n");
		 clearerr(fp); //清除标志
	 }
	 
	 /* 关闭文件 */
	 fclose(fp);
	 exit(0);
}

相关文章:

  • GOLANG SLICE 切片扩容
  • 并发编程Bug起源:可见性、有序性和原子性问题
  • LastPass 开发者系统被黑已窃取源代码
  • 设计模式摘要
  • 2.Hive表结构变更时,滥用MSCK REPAIR TABLE语句,导致变更语句执行时间过长
  • [I2C]I2C通信协议详解(一) --- 什么是I2C
  • 寄——在外拼搏的你一路平安,早日团圆
  • C++11之右值引用:移动语义和完美转发(带你了解移动构造函数、纯右值、将亡值、右值引用、std::move、forward等新概念)
  • 【手把手带你学JavaSE】第八篇:抽象类和接口
  • 18年程序员生涯,读了200多本编程书,挑出一些精华分享给大家
  • 广播解决方案:Livemind Recorder:录音机
  • 罗克韦尔AB PLC(RSLogix 5000)在线修改程序的具体方法示例
  • 2020 关于Map Map,String> Map,Object>的简单使用
  • 2019蓝桥杯省赛---java---C---5(最大降雨量)
  • 一键下载小说(二):如何在Django中部署
  • 【译】JS基础算法脚本:字符串结尾
  • [译]前端离线指南(上)
  • Javascript 原型链
  • js正则,这点儿就够用了
  • linux安装openssl、swoole等扩展的具体步骤
  • magento 货币换算
  • mockjs让前端开发独立于后端
  • Rancher如何对接Ceph-RBD块存储
  • scala基础语法(二)
  • 创建一个Struts2项目maven 方式
  • 从零搭建Koa2 Server
  • 机器学习 vs. 深度学习
  • 开发了一款写作软件(OSX,Windows),附带Electron开发指南
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 算法-插入排序
  • 哈罗单车融资几十亿元,蚂蚁金服与春华资本加持 ...
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 没有任何编程基础可以直接学习python语言吗?学会后能够做什么? ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​3ds Max插件CG MAGIC图形板块为您提升线条效率!
  • ​configparser --- 配置文件解析器​
  • ​Distil-Whisper:比Whisper快6倍,体积小50%的语音识别模型
  • #Z0458. 树的中心2
  • $().each和$.each的区别
  • (07)Hive——窗口函数详解
  • (42)STM32——LCD显示屏实验笔记
  • (力扣)循环队列的实现与详解(C语言)
  • (四) 虚拟摄像头vivi体验
  • (一) springboot详细介绍
  • (转)关于pipe()的详细解析
  • ./include/caffe/util/cudnn.hpp: In function ‘const char* cudnnGetErrorString(cudnnStatus_t)’: ./incl
  • .NET 4.0网络开发入门之旅-- 我在“网” 中央(下)
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET MVC第五章、模型绑定获取表单数据
  • .NET 解决重复提交问题
  • .NET上SQLite的连接
  • .Net转Java自学之路—基础巩固篇十三(集合)
  • @column注解_MyBatis注解开发 -MyBatis(15)
  • [ IOS ] iOS-控制器View的创建和生命周期
  • [ linux ] linux 命令英文全称及解释