Why two EOF needed as input? [duplicate]

Deadly 提交于 2019-12-18 07:06:29

问题


When I run the code below, I use three inputs (in Ubuntu terminal):

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

The code reacts well in all cases. My question is: why in 1) and 2) I need two EOF?

#include <iostream>

int main()
{
  int character;

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

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

}

回答1:


That's how the "EOF" character works (in "canonical" mode input, which is the default). It's actually never sent to the application, so it would be more accurate to call it the EOF signal.

The EOF character (normally Ctrl-D) causes the current line to be returned to the application program immediately. That's very similar to the behaviour of the EOL character (Enter), but unlike EOL, the EOF character is not included in the line.

If the EOF character is typed at the beginning of a line, then zero bytes are returned to the application program (since the EOF character is not sent). But if a read system call returns 0 bytes, that is considered an end-of-file indication. So at the beginning of a line, an EOF will be treated as terminating input; anywhere else, it will merely terminate the line and so you need two of them to terminate input.

For more details, see the .Posix terminal interface specification.




回答2:


You don't have "two EOF". Bash is putting the tty in raw mode, and interpreting ^D differently depending on context. If you type ^D after a newline, bash closes the input stream on the foreground process. If you type a few characters first, bash requires you to type ^D twice before doing so. (The first ^D is treated like 'delete')



来源:https://stackoverflow.com/questions/30689930/why-two-eof-needed-as-input

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!