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

Nam*_*ull 4 c unix shell stdin input

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

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

我还发现,如果我按ENTER,那么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;
}
Run Code Online (Sandbox Code Playgroud)

tha*_*guy 6

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

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

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

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

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