为什么需要两个 EOF 作为输入?

Why two EOF needed as input?

当我运行下面的代码时,我使用三个输入(在Ubuntu终端):

  1. abc(Ctrl+D)(Ctrl+D)
  2. abc(Ctrl+D)(回车)(Ctrl+D)
  3. abc(回车)(Ctrl+D)

代码在所有情况下都反应良好。我的问题是:为什么在 1) 和 2) 中我需要两个 EOF?

#include <iostream>

int main()
{
  int character;

  while((character=std::cin.get())!=EOF){}

  std::cout << std::endl << character << std::endl;

}

您没有"two EOF"。 Bash 将 tty 置于原始模式,并根据上下文对 ^D 进行不同的解释。如果在换行符后键入 ^D,bash 将关闭前台进程的输入流。如果您先输入几个字符,bash 会要求您输入 ^D 两次,然后再输入。 (第一个 ^D 被视为 'delete')

这就是 "EOF" 字符的工作方式(在 "canonical" 模式输入下,这是默认设置)。它实际上从未发送到应用程序,因此将其称为 EOF 信号会更准确。

EOF字符(通常是Ctrl-D)使当前行立即返回给应用程序。这与 EOL 字符 (Enter) 的行为非常相似,但与 EOL 不同的是,EOF 字符不包含在该行中。

如果在行首键入 EOF 字符,则零字节将返回到应用程序(因为未发送 EOF 字符)。但是如果 read 系统调用 returns 0 字节,则认为是文件结束指示。所以在一行的开头,一个 EOF 将被视为终止输入;在其他任何地方,它只会终止该行,因此您需要其中两个来终止输入。

有关详细信息,请参阅 .Posix terminal interface 规范。