为什么我应该在 CTRL+D 之前按 ENTER 来向标准输入指示 EOF?

2024-03-03

以下是我的代码,我在其中使用fgetc获取输入stdin。 (从 UNIX shell 运行程序)

我不明白的是,当我从键盘输入一些字符,然后按ctrl + D然后按ENTER,程序不会停止。在我看来,这EOF已经传给程序了,为什么还不停止呢?

我还发现如果我按ENTER, then ctrl + D,程序确实停止了,但是为什么呢?

#include "stdio.h"

int main()
{
    char ch;
    int i;
    for (i = 0; i < 200; i++)
    {
        ch = fgetc(stdin);
        if (ch == EOF)
            break;
    }
    return 0;
}

说 Ctrl-D 发送 EOF 是对孩子的教育谎言。它实际上所做的是使任何正在进行的read()从终端立即返回当前行缓冲区的内容(如果有)。

协同作用的发生是因为 Unix 约定是read()零字节代表 EOF。

这意味着如果您在缓冲区为空时按 Ctrl-D,read()将返回零字节,规范程序会将其解释为文件结尾。这显然只是一种幻觉,因为您仍然可以在终端上输入更多内容,而不太规范的程序可以根据需要继续阅读。

如果您在输入一些数据后按 Ctrl-D,那么该数据将被返回,并且规范程序将继续读取以查找换行符或它正在查找的其他内容。

这就是为什么只有在另一个 Ctrl-D (第一个刷新缓冲区,第二个返回现在为空的缓冲区)之后或按 Enter (出于相同原因)之后按下 Ctrl-D 时,才会在规范程序中触发 EOF 行为。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么我应该在 CTRL+D 之前按 ENTER 来向标准输入指示 EOF? 的相关文章

随机推荐