EOF是什么?

转自http://www.ruanyifeng.com/blog/2011/11/eof.html

学习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)。至于系统怎么知道文件的结尾,资料上说是通过比较文件的长度。

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

1 int c;
2
3 while ((c = fgetc(fp)) != EOF) {
4
5 do something
6
7 }

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

1 int c;
2
3 while (!feof(fp)) {
4
5 c = fgetc(fp);
6
7 do something;
8
9 }

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

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

 1 int c = fgetc(fp);
 2
 3 while (c != EOF) {
 4
 5 do something;
 6 c = fgetc(fp);
 7
 8 }
 9
10 if (feof(fp)) {
11
12 printf("\n End of file reached.");
13
14 } else {
15
16 printf("\n Something went wrong.");
17
18 }

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

1 int c;
2
3 while ((c = getchar()) != EOF) {
4
5 putchar(c);
6
7 }

但是,标准输入与文件不一样,无法事先知道输入的长度,必须手动输入一个字符,表示到达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,连续输入两次就行了。

时间: 2024-10-14 06:08:25

EOF是什么?的相关文章

[转载]C语言EOF是什么?

原贴网址:http://www.kuqin.com/language/20111112/314745.html 收藏于此: 我学习C语言的时候,遇到的一个问题就是EOF. 它是end of file的缩写,表示"文字流"(stream)的结尾.这里的"文字流",可以是文件(file),也可以是标准输入(stdin). 比如,下面这段代码就表示,如果不是文件结尾,就把文件的内容复制到屏幕上. int c; while ((c = fgetc(fp)) != EOF)

访问网站出现EOF

HTTP/0.0 503 Service Unavailable Date: Tuesday, 18-Apr-17 10:29:46 CST Keep-Alive: timeout=38 EOF 今天访问本地的项目,全部提示上面的那些信息EOF,不知道咋回事? 之前都都能正常访问,所以我猜想本地的项目本身肯定是没有问题的. 原因:代理软件-蓝灯(由于自己经常上Google,所以下载使用了蓝灯免费版使用) 我的解决方法: 1.关掉代理软件即可 2.给你本地的项目更换域名,重新绑定host即可 延伸

C语言EOF

验证表达式getchar()!=EOF的值是1还是0 编写一个打印EOF值的程序 windows下是ctrl-z 就是ctrl和z一起按了,就是结束符linux下是ctrl-d是结束符.这个是一个特殊的值,一般是-1 区分文件中有效数据与输入结束符.C语言采用的解决办法是:在没有输入时,getchar函数将返回一个特殊值,这个特殊值与任何实际字符都不同.这个值称为EOF(end of file,文件结束)

EOFError:EOF when reading a line

Sublime2编译Python程序EOFError:EOF when reading a line: 是因为Sublime2对于python中运行含有input或者raw_input的python代码时候会报错. 就是Sublime中,运行python代码时,暂不支持输入参数.如果代码中包含用户输入的函数时(eg. raw_input())Command+b编译运行之后会提示以下错  误: 解决方案, 安装SublimeREPL插件 windows下: 打开Sublime Text2编辑器,按

'0','\0',NULL,EOF的区别

要看是不是一个东西,打印一下即可 printf("%d %d %d %d\n",'0','\0',NULL,EOF); 输出: 48 0 0 -1 结论: '\0'与NULL 都是0,所以有的时候可以这样用: 初始化指针 char* p=0; 初始化字符串 char tmp[10] = {0} 或 memset(tmp,0,10) '0','\0',NULL,EOF的区别

诡异的EOF Exception

近日在写一个简单的HTTP代码中遇到了诡异的EOFException,当读取ResponseCode的时候就抛出了EOF异常,感觉很诡异,下面进行问题还原,以及分析和解决过程. 问题 有问题的代码如下: 点击阅读全文

雪泥鸿爪-教学中的debug(13) EOF与换行符

http://oj.hi-hi.cn/JudgeOnline/problem.php?cid=1088&pid=9 问题 J: 实验8_5:统计元音字母个数 题目描述 编写一程序,用于统计从键盘输入的字符串中的元音字母(a,A,e,E,i,I,o,O,u,U)的个数. 输入 每行输入一字符串 输出 输出对应字符串中元音字母的个数. 样例输入 abcio efgaeio ak akkkksd 样例输出 3 5 2 学生问, 请问这个错在哪儿?样例输出是正确的啊 1 #include<stdio

【学生信息管理系统】EOF 和 BOF

敲完学生信息管理系统时,在删除信息的时候,经常会出现下图这样的错误,遇到问题就要解决问题.经过查阅理解了记录集Recordset的EOF和BOF属性,用这两个属性可以知道记录集中是否有信息存在. EOF和BOF属性 BOF 指示当前记录位置位于 Recordset 对象的第一个记录之前. EOF 指示当前记录位置位于 Recordset 对象的最后一个记录之后. 返回值:BOF 和 EOF 属性返回布尔型值. 使用 BOF 和 EOF 属性可确定Recordset 对象是否包含记录,或者从一个记

EOF:getchar()函数返回的一个特殊值

EOF 是个宏,其意思是:End Of File,文件尾标志. 从数值上来看,就是整数-1在C语言的头文件中对其进行了宏定义:libio.h: # define EOF (-1)当读文件操作时,遇到文件结束位置或读数据出错均会返回 EOF. (C语言中所有的输入输出操作均是按读文件的思想来设计的,或者说,是文件操作的一种特例,如getchar()就是fgetc(stdin) 的一个宏 )int getchar() ; //从标准输入缓冲区读取一个字符,成功返回该字符的ASCII值,出错,返回EO

Linux C 字符函数 getchar()、putchar() 与 EOF 详解

首先给出<The_C_Programming_Language>这本书中的例子: #include <stdio.h> int main() { int c; c = getchar(); while (c != EOF) { putchar(); c = getchar(); } return 0; } 这里主要解释下为什么要用int型来接受getchar函数. 很多时候,我们会写这样的两行代码: char c; c = getchar(); 这样就很有可能出现问题.因为getc