为什么我应该在 CTRL+D 之前按 ENTER 以向标准输入指示 EOF?
Why should I press ENTER before CTRL+D to indicate an EOF to stdin?
以下是我的代码,其中我使用 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 是一种教育 lie-to-children。它实际上做的是从终端 return 立即使用当前行缓冲区的内容(如果有的话)进行任何正在进行的 read()
。
协同作用的发生是因为 Unix 约定 read()
零字节表示 EOF。
这意味着如果您在空缓冲区中按 Ctrl-D,read()
将 return 为零字节,规范程序会将其解释为 end-of-file .这显然只是一种错觉,因为您仍然可以在终端上输入更多内容,而不太规范的程序可以根据需要继续阅读。
如果您在输入一些数据后按 Ctrl-D,那么该数据只是 returned,规范程序将继续读取以找到换行符或它正在寻找的任何其他内容。
这就是为什么 EOF 行为仅在规范程序中触发,当 Ctrl-D 在另一个 Ctrl-D 之后被按下时(第一个刷新缓冲区,第二个 return 一个 now-empty 缓冲区)或在 Enter 之后(出于同样的原因)。
以下是我的代码,其中我使用 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 是一种教育 lie-to-children。它实际上做的是从终端 return 立即使用当前行缓冲区的内容(如果有的话)进行任何正在进行的 read()
。
协同作用的发生是因为 Unix 约定 read()
零字节表示 EOF。
这意味着如果您在空缓冲区中按 Ctrl-D,read()
将 return 为零字节,规范程序会将其解释为 end-of-file .这显然只是一种错觉,因为您仍然可以在终端上输入更多内容,而不太规范的程序可以根据需要继续阅读。
如果您在输入一些数据后按 Ctrl-D,那么该数据只是 returned,规范程序将继续读取以找到换行符或它正在寻找的任何其他内容。
这就是为什么 EOF 行为仅在规范程序中触发,当 Ctrl-D 在另一个 Ctrl-D 之后被按下时(第一个刷新缓冲区,第二个 return 一个 now-empty 缓冲区)或在 Enter 之后(出于同样的原因)。