以下是我的代码,我在其中使用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(使用前将#替换为@)