feof 和ferror函数详解

举报
芒果_Mango 发表于 2022/03/28 10:28:37 2022/03/28
【摘要】 大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流作者简介:CSDN C/C++领域新星创作者https://blog.csdn.net/chuxinchangcun?type=blog掘金LV3用户 https://juejin.cn/us...

大家好,我是芒果,一名非科班的在校大学生。对C/C++、数据结构、Linux及MySql、算法等领域感兴趣,喜欢将所学知识写成博客记录下来。 希望该文章对你有所帮助!如果有错误请大佬们指正!共同学习交流

作者简介:

13.feof 和ferror

注意:feof不是用来判断文件是否读取结束的


在文件读取过程中,不能用feof函数或者ferror函数的返回值直接用来判断文件是否读取结束

feof和ferror的真正用途:当文件读取结束时,判断是读取失败导致的结束,还是遇到文件尾结束


判断文件读取是否结束:

  • 判断返回值是否为EOF : fgetc函数
  • 判断返回值是否为NULL: fgets函数
  • 判断返回值是否小于实际要读取的个数:fread

feof-文件读取结束了,判断是不是遇到文件末尾而结束的

image-20220310225204465

作用:判断文件是不是遇到文件末尾结束

返回值:

image-20220310225214719

feof函数在第一次读操作后返回一个非零值,该操作试图读过文件的末尾。如果当前位置不是文件结束,则返回0。没有返回错误。 如果返回值不是0,说明就是遇到文件末尾结束的

ferror-文件读取结束了,判断是不是遇到错误后读取结束的

image-20220310225226468

作用:判断文件是不是遇到错误结束

返回值

image-20220310225235814

如果流上没有发生错误,则ferror返回0。否则,它将返回一个非零值。

文本文件的例子:

#include<stdio.h>
int main()
{
    //打开文件
    FILE* pf = fopen("test.txt","w");//以写的方式打开文件
    if(NULL == pf)
    {
        //打开失败,打印错误原因
        perror("fopen");
        return -1;
    }
    //写文件
    fputs("Mango",pf);
    //关闭文件
    fclose(pf);
    
    //再次打开文件进行读取
    fopen("test.txt","r");
    int  ch = 0;
    //当fgetc读取失败的时候/遇到文件结束的时候,都会返回EOF
    //注意:EOF -> 值为-1,ch的值要和EOF进行判断。ch最好写成int类型,防止报错,
    //注意优先级问题,ch读取时应该要括号括起来
    while((ch = fgetc(pf)) != EOF)
    {
        printf("%c ",ch);
    }
    //判断是什么原因结束的
    if(ferror(pf))
    {
        printf("I/O error when reading\n");
    }
    else if(feof(pf))
    {
        printf("End of file reached successfully\n");
    }
    //关闭文件并置空
    fclose(pf);
    pf = NULL;
    return 0;
}

执行结果

image-20220310225248529

是遇到了文件末尾结束


二进制文件的例子

#include<stdio.h>
int main()
{
    
    return 0;
}int main()
{
    //存文件
    FILE* pf = fopen("data.txt","wb");//以二进制写入形式打开文件
    if(NULL == pf)
    {
        perror("fopen");
        return -1;
    }
    int arr[4] = {3,4,5,6};
    fwrite(arr,sizeof(arr[0]),4,pf);//把arr的数据以二进制形式写入到pf中
    fclose(pf);
    //后面要读取写入的数据,所以先不置空
    
    //读取文件
	pf = fopen("data.txt","rb");//以二进制读取形式打开文件
    size_t tmp = 0; //fread的返回类型为size_t,反正报错
    int a = 0;
    //每次从流中读取1个数据到a,若返回值为1,说明成功读取,若小于1,则说明读取结束
    while( ( tmp = fread(&a,sizeof(int),1,pf) == 1 ) )
    {
        printf("%d ",a);
    }
    //判断是什么原因结束的
      if(ferror(pf))
    {
        printf("I/O error when reading\n");
    }
    else if(feof(pf))
    {
        printf("End of file reached successfully\n");
    }
    //关闭文件
    fclose(pf);
    pf = NULL;
    return 0;
}

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。