为什么要在按住CTRL+;键之前按ENTER键;D是否向标准DIN指示EOF?

为什么要在按住CTRL+;键之前按ENTER键;D是否向标准DIN指示EOF?,c,shell,unix,input,stdin,C,Shell,Unix,Input,Stdin,下面是我的代码,我使用fgetc从stdin获取输入。(从UNIX shell运行程序) 我不明白的是,当我从键盘上键入一些字符,然后按ctrl+D,然后按ENTER,程序不会停止。在我看来,EOF已经被传输到程序中,为什么不停止呢 我还发现,如果我按下ENTER,然后按下ctrl+D,程序确实会停止,但为什么呢 #包括“stdio.h” int main() { char ch; int i; 对于(i=0;i

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

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

我还发现,如果我按下
ENTER
,然后按下
ctrl+D
,程序确实会停止,但为什么呢

#包括“stdio.h”
int main()
{
char ch;
int i;
对于(i=0;i<200;i++)
{
ch=fgetc(标准偏差);
如果(ch==EOF)
打破
}
返回0;
}

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

之所以产生协同效应,是因为Unix的约定是零字节的
read()
表示EOF

这意味着,如果在缓冲区为空的情况下按Ctrl-D键,
read()
将返回零字节,规范程序将其解释为文件结尾。这显然只是一种幻觉,因为你仍然在那里在终端上输入更多的内容,而一个不太规范的程序如果想继续阅读,就可以继续阅读

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


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

如果您在一行中没有键入任何字符,则一个^D将发送EOF。如果键入了一些字符,请按^D两次以发送EOF。