我学习C语言的时候,遇到的一个问题就是EOF。

它是end of file的缩写,表示"文字流"(stream)的结尾。这里的"文字流",可以是文件(file),也可以是标准输入(stdin)。

比如,下面这段代码就表示,如果不是文件结尾,就把文件的内容复制到屏幕上。

  int c;

  while ((c = fgetc(fp)) != EOF) {

    putchar (c);

  }

很自然地,我就以为,每个文件的结尾处,有一个叫做EOF的特殊字符,读取到这个字符,操作系统就认为文件结束了。

但是,后来我发现,EOF不是特殊字符,而是一个定义在头文件stdio.h的常量,一般等于-1。

  #define EOF (-1)

于是,我就困惑了。

如果EOF是一个特殊字符,那么假定每个文本文件的结尾都有一个EOF(也就是-1),还是可以做到的,因为文本对应的ASCII码都是正值,不可能有负值。但是,二进制文件怎么办呢?怎么处理文件内部包含的-1呢?

这个问题让我想了很久,后来查了资料才知道,在Linux系统之中,EOF根本不是一个字符,而是当系统读取到文件结尾,所返回的一个信号值(也就是-1)。至于系统怎么知道文件的结尾,资料上说是通过比较文件的长度。

所以,处理文件可以写成下面这样:

  int c;

  while ((c = fgetc(fp)) != EOF) {

    do something

  }

这样写有一个问题。fgetc()不仅是遇到文件结尾时返回EOF,而且当发生错误时,也会返回EOF。因此,C语言又提供了feof()函数,用来保证确实是到了文件结尾。上面的代码feof()版本的写法就是:

  int c;

  while (!feof(fp)) {

    c = fgetc(fp);

    do something;

  }

但是,这样写也有问题。fgetc()读取文件的最后一个字符以后,C语言的feof()函数依然返回0,表明没有到达文件结尾;只有当fgetc()向后再读取一个字符(即越过最后一个字符),feof()才会返回一个非零值,表示到达文件结尾。

所以,按照上面这样写法,如果一个文件含有n个字符,那么while循环的内部操作会运行n+1次。所以,最保险的写法是像下面这样:

  int c = fgetc(fp);

  while (c != EOF) {

    do something;

    c = fgetc(fp);

  }

  if (feof(fp)) {

    printf("\n End of file reached.");

  } else {

    printf("\n Something went wrong.");

  }

除了表示文件结尾,EOF还可以表示标准输入的结尾。

  int c;

  while ((c = getchar()) != EOF) {

    putchar(c);

  }

但是,标准输入与文件不一样,无法事先知道输入的长度,必须手动输入一个字符,表示到达EOF。

Linux中,在新的一行的开头,按下Ctrl-D,就代表EOF(如果在一行的中间按下Ctrl-D,则表示输出"标准输入"的缓存区,所以这时必须按两次Ctrl-D);Windows中,Ctrl-Z表示EOF。(顺便提一句,Linux中按下Ctrl-Z,表示将该进程中断,在后台挂起,用fg命令可以重新切回到前台;按下Ctrl-C表示终止该进程。)

那么,如果真的想输入Ctrl-D怎么办?这时必须先按下Ctrl-V,然后就可以输入Ctrl-D,系统就不会认为这是EOF信号。Ctrl-V表示按"字面含义"解读下一个输入,要是想按"字面含义"输入Ctrl-V,连续输入两次就行了。

C语言中EOF是什么?相关推荐

  1. C语言中EOF的应用

    C语言中EOF的应用 2008年06月26日 星期四 13:58 1.5.1. 文件复制 借助于getchar 与putchar 函数,可以在不了解其它输入/输出知识的情况下编写出 数量惊人的有用的代 ...

  2. C语言中EOF的用法及不同环境下的使用

    C语言中EOF的含义是end of file,即文件结束符,但是不仅仅是在文件中使用,在输入的时候也可以使用.EOF的值是-1.在文本文件中才能使用EOF作为结束符.在使用scanf输入的时候,如果输 ...

  3. c语言eof不起作用,c语言中EOF的用法

    c语言中EOF的用法以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! c语言中EOF的用法 1.EOF是end of fi ...

  4. 关于c语言中EOF用法的理解

    作者:Senlern 转载请注明,原文链接:http://blog.csdn.net/zhang429350061/article/details/8760636 首先看一下EOF的官方解释: 计算机 ...

  5. c语言中eof的作用,深入解读C语言中的符号常量EOF

    EOF是指文件的结束符,是一个宏定义 借助于getchar 与putchar 函数,可以在不了解其它输入/输出知识的情况下编写出 数量惊人的有用的代码.最简单的例子就是把输入一次一个字符地复制到输出, ...

  6. c语言中eof的作用,C语言中,怎么用EOF结束输入?

    大话西游666 EOF 是个宏,其意思是:End Of File,文件尾标志. 从数值上来看,就是整数-1在C语言的头文件中对其进行了宏定义:1libio.h:    # define EOF (-1 ...

  7. c 语言中eof 是什么,什么是C编程语言中的EOF?

    从终端输入不会真的"结束"(除非设备已断开连接),但在终端中输入多个"文件"是有用的,因此键序列被保留以指示输入结束.在UNIX中,按键到EOF的转换由终端驱动 ...

  8. 【C语言】C语言中EOF的具体用法

    前言 在C语言中存在关键字EOF EOF是一个整数类型的宏定义,扩展为负数常量表达式(通常为-1).它被头文件中的好几个函数作为返回值使用,来表明已经到达文件尾或者示意一些其他的错误条件.它也被作为一 ...

  9. C语言中EOF含义及用法(新手向)

    EOF含义 是文件结束标志,英文全称(End of file) EOF的值为-1 常见用法 #include <stdio.h> int main() {char c;while ((c ...

最新文章

  1. 再见,PyTorch!
  2. UVa11100 The Trip,2007(贪心)
  3. android108 内存分配
  4. 4G通信模块在ARM平台下的应用
  5. 在 Java 中,如何批量读取本项目资源目录下的所有文件
  6. ExecutionException异常
  7. sql并发 锁 优化思路_并发优化–减少锁粒度
  8. java怎么用doss窗口_GitHub - doss128/symphony: 一款用 Java 实现的现代化社区(论坛/BBS/社交网络/博客)平台。...
  9. Qt工作笔记-QGraphicsProxyWidget放自定义界面实现拖动
  10. 【洛谷1341】无序字母对(欧拉回路)
  11. 旅游捞金的六大方式,玩着把钱赚了
  12. 用C#打造quot;QQ对战平台挤房器quot;
  13. 西门子224XP型PLC和MCGS触摸屏控制MM420变频器
  14. 用大白话聊聊JavaSE -- 如何理解Java Bean
  15. E.03.08. Scrapped Plans for London Concert Hall Sour Mood for U.K. Musicians
  16. Win11预装软件怎么卸载?Win11如何精简预装应用程序
  17. 订阅切换按钮(subscribe toggle button)
  18. [ UICompatibilityInputViewController ] WillAppear 崩溃处理
  19. feign.codec.DecodeException 异常原因
  20. taxi计费器c语言程序,毕业论文:出租车计费系统(全文完整版)

热门文章

  1. Android 系统内的守护进程 - main类服务(1) : netd
  2. 【新技术】:移动支付过程中的NFC技术
  3. WEB开发(7) Hibernate篇(上)
  4. 魔法少女小圆计算机音乐,魔法少女小圆 无损音乐合集
  5. F - 郭鑫的难题(三)
  6. 青少年ADHD双通路模型的神经相关性
  7. TCP/IP 协议详解内容总结
  8. 进程与应用程序的区别
  9. kmeans算法练习
  10. 配置sumlime html,Sublime Text 3使用SublimeLinter配置JS,CSS,HTML语法检查