判断一个文件的读取是否结束,很多人,会想到用feof函数来判定,的确需要用到这个函数,但是仅仅靠这个函数是不够的。

错误用法:

#include<stdio.h>int main()
{FILE* pf = fopen("2128.txt","r");if(pf == NULL){perror("pf");}if(feof(pf)){printf("end of file");}return 0;
}

运行结果:

实际上文件无内容,按理应该输出 end of file;

先看函数原型:

返回值:(搞清楚他的返回值含义就知道怎么使用了)

(读取的)当前位置不是文件末尾(可以理解为EOF)的时候返回0;其实就算读取到了EOF也是返回0

当要首次尝试读取文件末尾(EOF)后面的内容的时候返回非零值;(所以要想利用feof函数判定文件读取结束的前提是已经读取到了EOF,我们可以理解为只有feof函数才能读取EOF后面的内容,所以上面那个错误的用法中,读的是EOF,返回值为0,并不是EOF后面的内容)

这里解释一下文件结束符EOF,它只是一个stdio.h里面定义的一个标识符常量-1,并不是真正存在于文件中。比如一个空文件(无任何字符),我们读取一个字符,系统会默认给读取的内容赋值EOF(-1)。

但是有些文件读取函数读取失败的时候也会返回EOF;比如文本文件字符读取函数fgetc,二进制文件读取函数fread,它们读取失败的时候也返回EOF,因此,我们读取到了EOF后,需要判断是真正读到了文件末尾(即文件读取结束),还是读取函数发生了错误而返回的EOF

文本文件读取结束的判定:

#include<stdio.h>
int main()
{//char a[20];int c = 0;FILE* pf = fopen("2128.txt","r");if( pf == NULL){perror("pf");return 0;}while((c = fgetc(pf))!=EOF)//读取到了EOF跳出循环{putchar(c);}
//判定是否是fgetc函数读取出错,出错返回非零值;       if(ferror(pf))perror("pf");
//fgetc函数没出错,正常读取到了EOF,这时才能用feof定论else if(feof(pf))printf("end of file\n");fclose(pf);pf = NULL;return 0;
}

运行结果:

注意while循环里面的条件(c = fgetc(pf))!=EOF,读到EOF后跳出循环,只不过没有打印,此时可以理解光标已经指向了EOF后面的内容,所以最后面调用feof函数的时候,满足其返回值里面的说明:即尝试读取EOF后面的内容的时候返回非零值,因此我们先用ferror函数过滤掉fetc函数读取失败返回EOF的情况,再用feof函数来判定文件读取结束。(fetc函数读取发生错误ferror返回非零值。)

二进制文件读取结束的判定也是相同的道理,这里不再赘述。

c语言中关于文件读取结束的判定,以及feof函数的理解相关推荐

  1. C语言文件操作(四) —— 文件读取结束的判定(feof、ferror)

            目录 1.feof.ferror 函数返回值 (1) feof 函数 (2) ferror 函数 2.feof.ferror 函数函数使用 fgetc.fgets的返回值说明都有提到一 ...

  2. 文件结束的判定与feof函数

    文件结束的判断: 1.fget()读取结束后返回EOF. #include<stdio.h> #include<stdlib.h> int main() {FILE* fp = ...

  3. c语言中以追加只写方式打开文本文件,C语言中打开文件读取,写入的操作

    #include#includeint main(){ //打开文件并以读取的方式 FILE* file = fopen("E://1.txt","rt"); ...

  4. 【C语言进阶】文件的顺序读写、随机读写、文本文件和二进制文件、文件读取结束的判定以及文件缓冲区相关知识

    ​ ​

  5. 【C语言复习】C语言中的文件操作

    C语言中的文件操作 写在前面 文件操作 什么是文件 文件的分类 文件名 文件的操作 文件指针 文件的打开和关闭 文件的顺序读写 文件的随机读写 fseek ftell rewind feof 写在前面 ...

  6. c语言把一个字符从指定文件中读取的函数,C语言中对文件最基本的读取和写入函数...

    C语言中对文件最基本的读取和写入函数 C语言read()函数:读文件函数(由已打开的文件读取数据)头文件: #include 定义函数: ssize_t read(int fd, void * buf ...

  7. 用c语言对文件的写入和保存,C++_C语言中对文件最基本的读取和写入函数,C语言read()函数:读文件函数( - phpStudy...

    C语言中对文件最基本的读取和写入函数 C语言read()函数:读文件函数(由已打开的文件读取数据)头文件: #include 定义函数: ssize_t read(int fd, void * buf ...

  8. C语言文件读取结束判断正确方式

    前言 对于在文件操作时,怎么样判断文件是否结束,以feof来判断文件读取结束是否正确? 一.MSDN对feof的介绍? 对与返回值的描述是: feof函数在第一次读取操作后返回一个非零值,该操作试图读 ...

  9. verilog从txt中读取_verilog语言中的文件读写

    verilog语言中的文件读写 原创: IC控 IC控 2月22日 在Verilog语言中,对文件的读写一般用在编写testbench,而用到的系统函数大概有以下几种,首先是$fopen,然后是对文件 ...

最新文章

  1. Layui + bootstrap + servlet 的房屋出租管理系统
  2. mysql保留2位小数字段如何设置 浮点数
  3. 搜索专题: HDU1428漫步校园
  4. java 注册回调_java 实现回调代码实例
  5. [MATLAB调试笔记]Possion方程求网格点电场强度
  6. oracle存储过程无效字符_Oracle存储过程基础+ 错误代码
  7. jooq和jdbc_将jOOQ与JDBC比较
  8. leetcode —— 1290. 二进制链表转整数
  9. java stack 类 效率_Java中ArrayList、LinkedList、Vector、Stack的比较
  10. 3、CommonChunkPlugin提取公共js-以提取一个jquery为例
  11. AJAX Toolkits -- DropShadow
  12. pe卸载win10更新补丁_新图标+新功能!win10凌晨更新补丁
  13. 【产品工具使用】黑群晖史上最强安装教程
  14. 生信技能树 电脑配置linux,生信技能树----Linux练习题答案
  15. html是乱码怎么解决,如何解决html乱码问题
  16. MATLAB入门学习笔记8
  17. 微信小程序布局 左右结构简单例子
  18. 中国首台云电脑全面解析——天霆云计算董事长谈天霆专访
  19. ShuZu数组中插入一个数
  20. 关于计算机英语手抄报全国一等奖,获奖手抄报图片

热门文章

  1. python 凸优化
  2. 服务器系统取消登录密码,服务器取消密码
  3. lightdb对oracle的nvl/nvl2函数的支持
  4. 高频、高灵敏度1.8-1.9mv/GS、供电耐压8V 线性霍尔 MH481
  5. 爬虫(8)-Scrapy爬取微博用户粉丝,关注和微博内容
  6. 【kubernetes】从僵尸进程探讨容器的多进程管理
  7. 银联支付 返回商户 Nignx post请求405
  8. 华东师范大学计算机学院周俊,软件工程学院
  9. Android Activity旋转屏幕横屏实现全屏方法
  10. 跟着iMeta学作图 | 山峦图展示微生物丰度随盐度增加的动态变化