feof()原理和用法

feof()原理和用法一 feof 是什么 feof 是检测流上的文件结束符的函数 如果文件结束 则返回非 0 值 否则返回 0 一般在文件操作 中经常使用 feof 判断文件是否结束 二 feof 的经典错误根据这个函数的定义 一般大家都是这样使用的 但是这样使用 文件中无论是否有内容 都会被判断为 文件不为空 include stdio h intmai stdio h


一、feof()是什么?

feof()是检测流上的文件结束符的函数,如果文件结束,则返回非0值,否则返回0

一般在文件操作,中经常使用feof()判断文件是否结束。


二、feof()的经典错误

根据这个函数的定义,一般大家都是这样使用的,但是这样使用,文件中无论是否有内容,都会被判断为“文件不为空”。

#include 
      int main(void) { FILE *p; p = fopen("open.txt", "r"); if (feof(p)) { printf("文件为空。"); } else { printf("文件不为空。"); } return 0; }

三、feof()的原理

1.EOF

EOF是一个计算机术语,为End Of File的缩写,在操作系统中表示资料源无更多的资料可读取。资料源通常称为档案或串流。通常在文本的最后存在此字符表示资料结束。

这个定义的意思是,文档的结尾都有一个隐藏字符”EOF”,当程序读取它的时候,就会知道文件已经到达结尾。通常使用while循环加EOF判断作为读取结束的标志。

EOF 的值通常为 -1,但它依系统有所不同。

2.feof()

  • feof()的原理:
    • feof()函数,并不是通过读取到文件的EOF来评判,这个文件是否为空。
    • 对feof()来说,它的工作原理是,站在光标所在位置,向后看看还有没有字符。如果有,返回0;如果没有,返回非0。它并不会读取相关信息,只是查看光标后是否还有内容。


  • 直接使用时的错误分析:
    • 对于一个空文件来说,当程序打开它的时候,它的光标会停在文件的开头,但是由于文件里什么内容都没有存(但是EOF是存在的),即整个文件就存贮了一个EOF。当程序打开文件,并直接调用feof()时,这个函数就会站在光标的位置向后张望,结果就看见了EOF,然后就当然返回0了。



四、如何正确使用

既然我们明白了原理,那么如何正确的使用它呢?

#include 
        int main(void) { FILE *p; p = fopen("open.txt", "r"); getc(p); if (feof(p)) { printf("文件为空。"); } else { rewind(p);//将光标跳回到文件开头 int a; fscanf(p,"%d",&a); printf("%d", a); } return 0; }

分析:

  • 对于文件来说,无论是空文件,还是存有信息的文件,当文件被打开,光标处于默认的开头时,光标后都有信息,这时候调用feof()来查看光标后是否还有内容,就没意义。
  • 所以我们需要从相同中找不同,先使用getc(),从文件中读取一个字符,让光标向后移动一个字符。这时空文件的光标就已经移动到EOF的后面,这时使用feof()就会返回1了。这才是feof()的正确用法。
  • 但是要注意,一定要将光标回到文件的开头,因为之前判断文件是否为空时,将光标向前移动了一位,必须要将光标恢复到开头,这样才能保证文件的正常读取。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/200479.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午10:45
下一篇 2026年3月20日 上午10:45


相关推荐

  • kotlin 跳出循环[通俗易懂]

    kotlin 跳出循环[通俗易懂]kotlin跳出循环有一个标记,满足条件就跳到标记处。

    2022年6月3日
    38
  • python把局部变量赋值给全局变量_局部变量不赋初值

    python把局部变量赋值给全局变量_局部变量不赋初值理解的都没问题。但我想聊聊出现这种情况的原因。在讲原因之前,需要先知道python中变量的搜索顺序,这个顺序是LGB(不考虑闭包情况)即local本地,global全局,builtin内建。比如:a=1deftest():a=3print(a)test()函数内声明了局部变量a,在打印中使用,在本地环境中命中,因此使用的是3。也许你会问这个知识点我早就知道了,这和本问题有什么关…

    2025年8月6日
    3
  • mac navicat 激活码【永久激活】

    (mac navicat 激活码)2021最新分享一个能用的的激活码出来,希望能帮到需要激活的朋友。目前这个是能用的,但是用的人多了之后也会失效,会不定时更新的,大家持续关注此网站~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html…

    2022年3月21日
    143
  • frp服务器搭建

    frp服务器搭建使用 frp 可以实现内网穿透 不用我说吧 本次使用的是三丰云的免费云服务器官网是 https m sanfengyun com home 首先在终端输入 wgethttps github com fatedier frp releases download v0 33 0 frp 0 33 0 linux amd64 tar gz 之后进行解压输入 tar zxvffrp 0 33 0 linux amd64 tar gz 对解压出来的文件夹更名为 frp 方便管理 输入 cd roo

    2026年3月26日
    3
  • thinkphp+ajax 实现点击加载更多数据

    thinkphp+ajax 实现点击加载更多数据

    2021年10月30日
    54
  • Oracle DBA 路途遥远「建议收藏」

    Oracle DBA 路途遥远「建议收藏」好用的OracleDBA为什么这么难找? 这不但是很多CIO的痛,也是很多IT主管搅尽脑汁也解决不了的问题。可那么多从ORACLE培训班拿到OCP认证的人跑哪里去了呢? 小白是一个拥有OCP证照,且对数据库本身的架构、运作原理有一定了解的数据库管理员。原以为一切都没问题的,无奈小白刚一就任,就面临到替换公司数据库系统主机的问题。小白没有程序开发与主机系统管理等经验,小白是那种一毕

    2026年4月13日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号