EOF到底是什么

EOF到底是什么,从我接触至今困惑了好久,于是去搜了一下,在阮一峰的博客找到了答案,算比较好懂的,不得不说这是个好博客=A=

EOF在书上,看了两本(才两本=A=),解释都是这样的:

EOF , end of file, 文件结束

啥,为什么文件结束会有个值,他要拿来干嘛?

而且在C中以前尝试过输出,输出结果为-1,这又是什么个情况?

实际上,找了一下标准库<stdio.h>内确实有一句:#define EOF (-1)也就是说值好像是人为定义的,相信其他语言也有相同的文本定义(实际上目前我只接触了PHP),那么既然如此,文本里出现-1会怎么样呢?实际上:

在Linux系统之中,EOF根本不是一个字符,而是当系统读取到文件结尾,所返回的一个信号值(也就是-1)

我们平时输入的-1EOF的值并不一样,我们平时的-1实际上是负号与数字1的结合,而对于EOF,我们可以看做是一个字符,在该文评论下也就类似的解释:

32位系统下,int是4字节的,-1对应的是0xFFFFFFFF,而fgetc()是一个个字节地读,所以,如果有一个二进制文件的4个字节是-1,那么实际上会读出4个0xFF来。

当然,如果出错,也会返回EOF,并且,EOF不仅可以作为文件结尾,还可以作为标准输出结尾,这就是我在书上看到的EOF的用途了。

#include <stdio.h>

main(void)
{
    int c;

    c = getchar();
    while (c != EOF) {
        putchar(c);
        c = getchar();
    }
}

Wrong:比如这段,我们输入一个值,然后会一个个字符读取到结尾,这个有点类似于PHP遍历目录,也就是我说过的读到不能再读

斜体部分错误,其实并没有读到EOF,EOF需要手动输入,Win下是CTRL+Z,扩展阅读中也有说到。

例如:

main(void)
{
    long nc;

    nc = 0;
    while (getchar() != EOF)
        ++nc;
    printf("%ld\n", nc);

    return 0;
}

如果我们不手动结束,是不会有输出值的。

总之,这是一个很神奇的特殊值。

扩展阅读(也就是那篇文章):http://www.ruanyifeng.com/blog/2011/11/eof.html

植入部分

如果您觉得文章不错,可以通过赞助支持我。

如果您不希望打赏,也可以通过关闭广告屏蔽插件的形式帮助网站运作。

标签: 知识, 代码段

添加新评论