EOF到底是什么
EOF到底是什么,从我接触至今困惑了好久,于是去搜了一下,在阮一峰的博客找到了答案,算比较好懂的,不得不说这是个好博客=A=
EOF在书上,看了两本(才两本=A=),解释都是这样的:
EOF , end of file, 文件结束
啥,为什么文件结束会有个值,他要拿来干嘛?
而且在C中以前尝试过输出,输出结果为-1
,这又是什么个情况?
实际上,找了一下标准库<stdio.h>
内确实有一句:#define EOF (-1)
也就是说值好像是人为定义的,相信其他语言也有相同的文本定义(实际上目前我只接触了PHP),那么既然如此,文本里出现-1
会怎么样呢?实际上:
在Linux系统之中,EOF根本不是一个字符,而是当系统读取到文件结尾,所返回的一个信号值(也就是-1)
我们平时输入的-1
和EOF
的值并不一样,我们平时的-1
实际上是负号与数字1的结合,而对于EOF,我们可以看做是一个字符,在该文评论下也就类似的解释:
32位系统下,int是4字节的,-1对应的是0xFFFFFFFF,而fgetc()是一个个字节地读,所以,如果有一个二进制文件的4个字节是-1,那么实际上会读出4个0xFF来。
当然,如果出错,也会返回EOF,并且,EOF不仅可以作为文件结尾,还可以作为标准输出结尾,这就是我在书上看到的EOF的用途了。
1#include <stdio.h>
2
3main(void)
4{
5 int c;
6
7 c = getchar();
8 while (c != EOF) {
9 putchar(c);
10 c = getchar();
11 }
12}
13
Wrong:比如这段,我们输入一个值,然后会一个个字符读取到结尾,这个有点类似于PHP遍历目录,也就是我说过的读到不能再读
斜体部分错误,其实并没有读到EOF,EOF需要手动输入,Win下是CTRL+Z,扩展阅读中也有说到。
例如:
1main(void)
2{
3 long nc;
4
5 nc = 0;
6 while (getchar() != EOF)
7 ++nc;
8 printf("%ld\n", nc);
9
10 return 0;
11}
12
如果我们不手动结束,是不会有输出值的。
总之,这是一个很神奇的特殊值。
扩展阅读(也就是那篇文章):http://www.ruanyifeng.com/blog/2011/11/eof.html
评论 (0)