首页 > 其他分享 >【C语言】详解feof函数和ferror函数

【C语言】详解feof函数和ferror函数

时间:2024-08-03 12:28:23浏览次数:8  
标签:fp 文件 函数 ferror feof 读取

文章目录

前言

或许我们曾在网络上看过有关于feof函数,都说这个函数是检查文件是否已经读取结束了。但事实却并非如此,要想知道更多的细节,那就往下看看吧!探索

1. feof

谨记:在读取文件的过程中,feof的返回值不是用于判断文件是否读取结束。

feof函数是判断文件在读取的过程中给是否是遇到了文件结束标志(EOF)。但是文件读取结束的原因不仅仅是因为遇到了文件结束标志,还可能是因为遇到了各种文件在读取过程中发生的错误所导致文件读取提前结束的。

很多人误用这个函数来判断文件内容是否为空,换句话说,就是判断这个文件是否为空文件!

feof函数作用:当文件读取结束时,判断文件读取结束的原因是否是:遇到了文件结束结束标志

1.1 feof函数原型

feof函数原型
feof函数的形参和返回值
在文件光标处遇到文件末尾标记时,feof函数返回一个非0值,否则返回0值。

1.2 正确利用函数特性读写文件

1.2.1 针对文本文件

对于文本文件来说,文件读取结束时可能会返回EOF(fgetc),或者返回NULL(fgets)

  • fgetc判断是否为EOF
  • fgets判断返回值是否为NULL

1.2.2 针对二进制文件

对于二进制文件来说,判断的方法就比较单一了。用fread函数。

fread函数判断其规定读取的个数(也就是fread的返回值)是否大于实际读取的个数,如果大于的话,就说明文件读取结束了。

1.3 feof函数实例演示

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
	int c; // 注意:int,⾮char,要求处理EOF
	FILE* fp = fopen("test.txt", "r");
	if (!fp) {
		perror("File opening failed");
		return EXIT_FAILURE;
	}

	//fgetc 当读取失败的时候或者遇到⽂件结束的时候,都会返回EOF
	while ((c = fgetc(fp)) != EOF) // 标准C I/O读取⽂件循环
	{
		putchar(c);
	}

	printf("\n");

	//判断是什么原因结束的
	if (ferror(fp))
		puts("I/O error when reading");
	else if (feof(fp))
		puts("End of file reached successfully");
	fclose(fp);
	fp = NULL;
	return 0;
}

2. ferror

在讲解feof函数的实例演示时,在例子中出现了一个ferror,那这个函数又是干嘛的?我们就来探讨一下。

还记得,在讲标准流时,提到过stderr标准错误流,这是一个根据系统遇到错误,而通过器编译器内部提早定义的宏自动对应上错误信息。

那么在文件缓冲系统中,自然也有这么一个设定。可是它这个就没有那么智能了。我们把这个就称作为文件错误标志。

ferror函数作用:在文件读取结束时,检查是否是因为遇到了文件错误标志。

2.1 ferror函数原型

ferror函数原型
ferror函数的形参和返回值
ferror的返回值为非0值时,就说明遇到了文件错误标志了,否则返回0 。

这个例子就不过多展示了,大家可以结合前面的例子进行分析。

如果大家觉得写的还不错的话,麻烦给偶点个赞吧!!!❤️❤️

标签:fp,文件,函数,ferror,feof,读取
From: https://blog.csdn.net/tianxiawushanu/article/details/140887764

相关文章

  • 【hive聚合函数多行合并 】
    Hive是一种开源的数据仓库解决方案,它提供了一种将结构化和半结构化数据存储在Hadoop集群上的方法。Hive通过使用Hive查询语言(HQL)将数据转换为可查询的表格形式,使用户能够使用SQL类似的语法进行数据分析和查询。在Hive中,聚合函数在数据分析中扮演着重要的角色,而多行合并是一......
  • 生成函数 学习笔记
    生成函数学习笔记有一部分没地方写的组合数学,先写这里。0.pre-learning1.上升/下降幂:\[n^{\underline{k}}=n\times(n-1)\times\cdots\times(n-k+1)\]称为\(n\)的下降幂。同理:\[n^{\overline{k}}=n\times(n-1)\times\cdots\times(n+k-1)\]称为\(......
  • 机械学习—零基础学习日志(高数19——函数极限理解深化)
    零基础为了学人工智能,真的开始复习高数本次学习笔记,主要讲解函数极限的计算问题。极限四则运算规则这里有几个需要注意的地方。函数极限的四则运算,需要知道极限存在才能大胆放心的使用。而且使用超实数的概念会更好帮助我们理解,极限的运算。以下图来说。大量的同学,会直接......
  • C语言——函数
    C语言——函数函数的语法函数的调用关系递归函数的主要思想是:函数其实是从上到下逐步求解的过程,把一个大的问题拆成多个小的子问题或者说把一个大的功能拆成小的功能模块,通过实现小的功能最终实现大的功能的过程。函数的语法类型标识符函数名(形式参数){函数体......
  • 6.C基础_输入输出函数
    putchar功能:输出一个字符函数声明:intputchar(intc);返回值:参数c的ASCLL码值c:要输出的字符,可以为字符常量、字符变量或表达式注意点:输出的结果不带'\n'getchar功能:从键盘读一字符函数声明:intgetchar(void);返回值:获取数据的ASCLL码值,当输入ctrl+d时会退出获取,此......
  • 从汇编层面看c/c++函数调用过程
    函数调用分析前置知识:全局变量:在函数内部定义的变量局部变量:在函数外部定义的变量esp:存储当前函数栈底的地址ebp:存储当前函数栈顶的地址对于函数形参(实际上):简单:cpu寄存器中复杂:栈中开空间函数调用机制:局部变量占用的内存是在程序执行过程中“动态”地建立和释放的......
  • 嵌入式软件--C语言高级 DAY 8.5 相关函数
    递归函数在嵌入式中应用不常见,但对于学习C语言的我们,也要时刻记得它的作用和用法。此外还要记住sprintf尤其重要!还有时间戳!一、递归函数1.概念一个函数在函数体内又调用了本身。但必须满足两个条件:具有明显的结束条件;趋近于结束条件的趋势。2.递归原理#include<stdio.h>......
  • 函数指针和指针函数的使用
    指针函数1:本质函数,返回值为指针1.2:格式:数据数据*函数名(形参){函数体return地址;//失败一般会返回NULL}#include<stdio.h>#include<stdlib.h>char*yue(){//chara[32]="hello";//栈区,函数调用结束后空间被释放//char*s="hello";//常量区,不会被释......
  • rows和range的区别--窗口函数
    目录1.rows和range关键字的区别2.例题:2.1 求最近三个月(前两个月和当前月)的累计销量2.2 计算最近3个月(前两个月和当前月)的累计销量1.rows和range关键字的区别rows和range关键字,都可以用来定义windowframe范围:rowsbetween上限and下线rangebetween上限and......
  • 一次函数杂谈
    update2024.7.25更改内容update2024.8.1更改内容+图床更改4.一次函数4.1函数的认识函数的定义:一般地,如果在一个变化过程中有两个变量\(x\)和\(y\),并且对于变量\(x\)的每一个值,变量\(y\)者都有唯一的值与它对应,那么我们称\(y\)是\(x\)的函数,其中\(x\)......