【问题标题】:Why two EOF needed as input? [duplicate]为什么需要两个 EOF 作为输入? [复制]
【发布时间】:2015-06-07 04:03:14
【问题描述】:

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

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

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

#include <iostream>

int main()
{
  int character;

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

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

}

【问题讨论】:

标签: c++ iostream eof


【解决方案1】:

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

【讨论】:

  • @rici 您的解释是绝对需要的,因为我的回答完全错误。 Bash 在接收命令时将 tty 置于原始模式,但它会将 tty 置于规范模式以运行命令。
【解决方案2】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2014-04-26
    • 2019-08-26
    • 2011-08-05
    • 1970-01-01
    • 2013-10-07
    • 2019-02-07
    • 2015-11-07
    • 1970-01-01
    相关资源
    最近更新 更多