如何解决为什么要在CTRL + D之前按ENTER来指示标准输入法的EOF?
以下是我的代码,我在其中使用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;
}
解决方法
说Ctrl-D发送EOF是对孩子的教育性谎言。它实际上的作用是使来自终端的任何正在进行的read()
立即返回当前行缓冲区的内容(如果有的话)。
发生协同作用是因为Unix约定是零字节的read()
代表EOF。
这意味着,如果在缓冲区为空的情况下按Ctrl-D,read()
将返回零字节,并且规范程序会将其解释为文件末尾。显然,这只是一种错觉,因为您仍然需要在终端上输入更多内容,如果需要的话,不那么规范的程序可以继续阅读。
如果您在输入一些数据后按Ctrl-D,则仅返回该数据,并且规范程序将继续读取以查找换行符或其他所需内容。
这就是为什么只有在另一个Ctrl-D之后(第一个刷新缓冲区,第二个返回现在为空的缓冲区)或Enter(相同的)后,再按Ctrl-D,才会在规范程序中触发EOF行为原因)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。