一分钟让你学会如何判断文件是否结束

news2024/11/24 9:23:57

文章目录

  • 前言
  • ferror函数
  • feof函数
  • ferror函数与feof函数搭配使用

前言

在所有的文件输入输出函数中,我们介绍了一系列的与文件的顺序读写有关的函数,它们调用成功与失败时的返回值各不相同,为了能更好地记忆这些函数,我们将这些函数的返回值进行了总结,并列入表格:

在这里插入图片描述
这样一一列举出来后,看似已经非常清楚明了,实际却还有一些小细节:

1> fgetc函数返回EOF时,可能是读取数据时发生错误,也可能是已经读取到文件末尾了。
2> fgets函数返回NULL时,可能是读取数据时发生错误,也可能是已经读取到文件末尾了。
3> fscanf函数返回EOF时,可能是读取数据时发生错误,也可能是在第一次转换之前到达文件流的末尾。
4> fread函数返回的值小于要求读取的完整项的数目时,可能是读取数据时发生错误,也可能是在达到读取的规定数目之前遇到文件结尾。

这些不同的情况返回的却是同一个值,当fgetc函数返回EOF时,我们不能断定一定是读取数据时发生错误了,当fscanf函数返回EOF时,我们也不能断定它就是文件读取结束了。所以,出现了一类函数,它们的功能就是,判断文件操作函数是以一种什么方式结束。

注意:以下介绍的函数的功能不是判断文件操作函数是否调用失败,而是在文件操作函数已经调用失败的情况下,判断文件操作函数调用失败的原因。

ferror函数

int ferror( FILE *stream );

ferror函数的功能就是判断使用某一文件指针的过程中,是否发生错误,若使用时没有发生错误,则ferror函数返回0;否则,ferror函数将返回一个非零的值。调用ferror函数时,我们只需将待检查的文件指针传入即可。

	if (ferror)
	{
		printf("文件指针使用时,发生错误\n");
	}

feof函数

int feof( FILE *stream );

feof函数的功能也是判断使用某一文件指针的过程中,是否读取到文件末尾,若使用时没有读取到文件末尾,则feof函数返回0;否则,feof函数将返回一个非零的值。调用feof函数时,也只需将待检查的文件指针传入即可。

	if (feof(pf))
	{
		printf("文件指针使用时,读取到文件末尾\n");
	}

ferror函数与feof函数搭配使用

当前言中说到的文件操作函数调用失败时,我们就可以同时运用ferror函数和feof函数,来判断文件操作函数调用失败的准确原因。

例如,文件data.txt文件中的数据为"abcdef",我们要用fgetc函数读取data.txt文件中的数据,当数据读取完之后,我们就可以用ferror函数和feof函数,来判断最后一次fgetc函数调用失败的原因:

#include <stdio.h>
#include <string.h>
#include <errno.h>
int main()
{
	//打开文件
	FILE* pf = fopen("data.txt", "r");
	if (pf == NULL)
	{
		printf("%s\n", strerror(errno));
		return 1;//文件打开失败,失败返回
	}
	//读取文件中的数据
	int ch = 0;
	while ((ch = fgetc(pf)) != EOF)
	{
		printf("%c", ch);
	}
	if (ferror(pf))
	{
		printf("文件指针使用时,发生错误而结束\n");
	}
	else if (feof(pf))
	{
		printf("文件指针使用时,读取到文件末尾而结束\n");
	}
	//关闭文件
	fclose(pf);
	pf = NULL;
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/749452.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

react使用SVGA特效 常用api

下载插件 npm install svgaplayerweb --save react中代码 import React, { useEffect } from react; import SVGA from svgaplayerweb const Svga () > {const bofang () > {var player new SVGA.Player(#demoCanvas);//创建实例var parser new SVGA.Parser(#demo…

【经验贴】项目管理过程中最容易忽略的问题,你踩了几个?

“有没有一句话送给刚入行的项目经理&#xff1f;” 随着毕业季的到来&#xff0c;最近发现越来越多类似的话题&#xff0c;评论区成了众多项目经理自嘲的“据点”&#xff0c;部分新手项目经理看完可能要重新考虑下职业规划了。 “要重点关注客户的需求&#xff0c;而不是项…

Android蓝牙协议栈fluoride(一) - 概述

发展 Android 4.2之前的版本采用Linux官方的蓝牙协议栈BlueZ&#xff0c;Android 4.2开始使用google和Broadcom共同开发的Bluedroid来替代BlueZ&#xff0c;但早期的Bluedroid并不完善&#xff0c;存在较多问题&#xff0c;更新迭代后将其更名为fluoride。接下来的系列文章将逐…

接口测试之深入理解HTTPS

前言 随着网络安全问题越来越被重视&#xff0c;HTTPS协议的使用已经逐渐主流化。目前的主流站点均已使用了HTTPS协议&#xff1b;比如&#xff1a;百度、淘宝、京东等一二线主站都已经迁移到HTTPS服务之上。而作为测试人员来讲&#xff0c;也要需时俱进对HTTPS协议要有一定的…

分布式调用与高并发处理 Dubbo分布式调用

一、Dubbo概念 1.1 什么是分布式系统 单机架构 一个系统业务量很小的时候所有的代码都放在一个项目中就好了&#xff0c;然后这个项目部署在一台服务器上&#xff0c;整个项目所有的服务都由这台服务器提供。 缺点&#xff1a; 服务性能存在瓶颈代码量庞大&#xff0c;系统臃…

未跟踪的文件: (使用 “git add <文件>...“ 以包含要提交的内容)怎么移除这些内容

有时候我们常常修改一些内容 手动就是&#xff1a;rm -rf system/core/healthd/images/.png 怎么丢弃呢&#xff1f; git clean -f . 删除这种文件

微信小程序设置底部导航栏

微信小程序设置底部导航栏 1、前言2、图标准备3、小程序tabbar设置 1、前言 我们先来看下效果图&#xff1a; 注意&#xff1a; 导航栏数量最多5个&#xff0c;最少两个。 2、图标准备 阿里图标库 http://www.iconfont.cn/collections/show/29 我们进入该网站&#xff0c;选…

第九章(1):循环神经网络与pytorch示例(RNN实现股价预测)

第九章&#xff08;1&#xff09;&#xff1a;循环神经网络与pytorch示例&#xff08;RNN实现股价预测&#xff09; 作者&#xff1a;安静到无声 个人主页 作者简介&#xff1a;人工智能和硬件设计博士生、CSDN与阿里云开发者博客专家&#xff0c;多项比赛获奖者&#xff0c;发…

1.4 MVP矩阵

MVP矩阵代表什么 MVP矩阵分别是模型&#xff08;Model&#xff09;、观察&#xff08;View&#xff09;、投影&#xff08;Projection&#xff09;三个矩阵。 我们的顶点坐标起始于局部空间&#xff08;Local Space&#xff09;&#xff0c;在这里他成为局部坐标&#xff08;L…

【PHP面试题35】什么是MVC,为什么要使用它

文章目录 一、前言二、MVC介绍2.1 模型&#xff08;Model&#xff09;2.2 视图&#xff08;View&#xff09;2.3 控制器&#xff08;Controller&#xff09; 三、MVC模式的优点四、总结 一、前言 本文已收录于PHP全栈系列专栏&#xff1a;PHP面试专区。 计划将全覆盖PHP开发领域…

『分割』 平面模型分割

PCL提供的几个常见模型&#xff1a; pcl::SACMODEL_PLANE&#xff1a;平面模型&#xff0c;用于拟合平面结构的点云数据。 pcl::SACMODEL_SPHERE&#xff1a;球体模型&#xff0c;适用于拟合球体结构的点云数据。 pcl::SACMODEL_CYLINDER&#xff1a;圆柱体模型&#xff0c;用…

一个四年Android程序猿的2023上半年总结

一晃就做了四年的Android开发了&#xff0c;时光飞逝啊&#xff5e; 工作的时间飞快&#xff0c;感觉每一天都很充实&#xff0c;但是大多数都是重复的样子。 去年的目标达成&#xff1a; 去年的目标就是学习学习&#xff0c;涨薪涨薪。上家公司的同事氛围很不错&#xff0…

一篇文章了解Redis分布式锁

Redis分布式锁 什么是分布式锁&#xff1f; ​ redis分布式锁是一种基于redis实现的锁机制&#xff0c;它用于在多并发分布式环境下控制并发访问共享资源。在多个应用程序或是进程访问共享资源时&#xff0c;分布式锁可以确保只有一个进程可以访问该资源&#xff0c;不会发生…

采用555时基电路的简易/可调定时长延时电路设计

采用 555 时基电路的简易长延时电路 本电路和一般的定时电路相比是通过在 555 时基电路的 5 脚处加了一个二极管 VD1&#xff0c;使得定时时间延长的特点。 一、电路工作原理 电路原理如图 11 所示。 当按下按钮SB时&#xff0c;12V的电源通过电阻器Rt向电容器Ct充电&#…

弹性IP和公网IP有什么区别?哪个好

​  弹性IP和公网IP有什么区别?哪个好。IP是服务器重要的组成资源&#xff0c;一台云服务器实例一般分为公网IP和内网IP&#xff0c;公网IP指的是对外访问的IP地址&#xff0c;是针对公众用户的IP&#xff0c;这是网站绑定的服务器IP地址。而内网IP顾名思义就是内部的网络IP…

Android Monkey稳定性测试

l 命令样例&#xff1a; adb shell monkey -p packagename --ignore-timeouts --ignore-crashes -v -v --throttle 200 1000000 各个参数的意义如下&#xff1a; -p 用此参数指定一个或多个包&#xff08;Package&#xff09;。指定包之后&#xff0c;Monkey将只允许系统启…

cmake多文件、多文件夹编译(2)

一、同级文件夹下代码调用问题 目录如下&#xff1a; ./testCMake&#xff08;根目录&#xff09;&#xff1a; /build&#xff1a; /MyClass: CMakeLists.txt MyClass.cpp MyClass.h /MyFunction: CMakeLists.txt MyFunction.cpp MyFunction.h CMakeLists.txt main.cpp 上述…

day35-Postman/ajax

0目录 1.postman 2.ajax 1.Postman 1.1 定义&#xff1a;postman用于测试http协议接口&#xff0c;无论是开发还是测试人员 1.2 Servlet中的doGet&#xff08;&#xff09;/daPost…

基于JavasSwing+MySQL的医药销售管理系统

点击以下链接获取源码&#xff1a; https://download.csdn.net/download/qq_64505944/87987881?spm1001.2014.3001.5503 功能&#xff1a;管理员与普通用户两个角色登录&#xff0c;可以增删改查用户&#xff0c;增删改查药品等功能 JDK1.8 MySQL5.7

微信小程序——开发入门

注册小程序 微信公众平台 设置相关信息 设置好之后需要去获取appID和秘钥&#xff0c;后序开发需要用到。 下载开发工具并安装 微信开发者工具&#xff08;稳定版 Stable Build&#xff09;下载地址与更新日志 | 微信开放文档 创建项目 打开开发者工具创建一个新项目并如下…