当我运行下面的代码时,我使用三个输入(在Ubuntu终端中):
代码在所有情况下反应良好。我的问题是:为什么1)和2)我需要两个EOF?
#include <iostream>
int main()
{
int character;
while((character=std::cin.get())!=EOF){}
std::cout << std::endl << character << std::endl;
}
答案 0 :(得分:4)
你没有&#34;两个EOF&#34;。 Bash将tty置于原始模式,并根据上下文不同地解释^ D.如果在换行符后键入^ D,bash将关闭前台进程上的输入流。如果首先键入几个字符,bash要求您在执行此操作之前键入^ D两次。 (第一个^ D被视为&#39;删除&#39;)
答案 1 :(得分:3)
这就是“EOF”字符的工作原理(在“规范”模式输入中,这是默认设置)。它实际上从未发送到应用程序,因此将其称为EOF
信号会更准确。
EOF
字符(通常为 Ctrl-D )会立即将当前行返回给应用程序。这与EOL
字符( Enter )的行为非常相似,但与EOL
不同,行中不包含EOF
字符。
如果在行的开头键入EOF
字符,则将零字节返回给应用程序(因为不发送EOF
字符)。但是如果read
系统调用返回0字节,则认为这是文件结束指示。所以在一行的开头,EOF
将被视为终止输入;在其他任何地方,它只会终止该行,因此您需要其中两个来终止输入。
有关详细信息,请参阅.Posix terminal interface规范。