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

时间:2015-06-07 04:03:14

标签: c++ iostream eof

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

  1. ABC(按Ctrl + d)(按Ctrl + d)
  2. ABC(按Ctrl + d)(输入)(按Ctrl + d)
  3. abc(回车)(Ctrl + D)
  4. 代码在所有情况下反应良好。我的问题是:为什么1)和2)我需要两个EOF?

    #include <iostream>
    
    int main()
    {
      int character;
    
      while((character=std::cin.get())!=EOF){}
    
      std::cout << std::endl << character << std::endl;
    
    }
    

2 个答案:

答案 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规范。