istream_iterator在读取字符时忽略EOF(Ctrl + D)

Sas*_*asQ 3 c++ cin istream-iterator istream eof

我正试图istream_iterator用来读取人物cin.我已经读过按Ctrl+ D发送一个EOF结束输入流的字符.不幸的是,它出了问题.这是我的代码:

#include <iterator>
int main()
{
  using namespace std;

  istream_iterator<char> it(cin), eos;
  while (it != eos) clog << *(it++);
}
Run Code Online (Sandbox Code Playgroud)

我正在运行它并键入:as df,然后按Ctrl+ D.它只输出asd没有最后一个f然后挂起等待输入.当我输入gh并再次按Ctrl+ D时,它会打印f最后的剩余部分和g下一个输入,但是再次没有最后一个输入h.当我最后按Ctrl+ D而不键入任何内容时,它会打印剩余的h和退出.

我期望它能够读取asdf和退出,因为我已经在第一个序列的末尾按了Ctrl+ D.

到达后为什么还在等待输入EOF
为什么它不打印以前读过的最后一个字符EOF
为什么只有当我按Ctrl+ D之前没有输入任何内容时才会退出?
这个循环如何改变以使其按照我期望的方式运行?(即在输入中获得Ctrl+ D序列后立即停止读取,无论我之前输入的是否有任何内容,并且读取所有字符直到EOF).

Cub*_*bbi 6

输入迭代器需要特别小心.以这种方式重写你的循环,行为将变得类似于任何其他字符输入循环:

while (it != eos)
{
    clog << *it;
    it++;
}
Run Code Online (Sandbox Code Playgroud)

这将照顾"为什么它不打印最后一个字符"

PS:对于行中间的EOF,它是POSIX规定的行为:

收到后,等待读取的所有字节将立即传递给进程,而不等待换行,并丢弃EOF.因此,如果没有字节等待(即,EOF发生在行的开头),则应从read()返回字节计数为零,表示文件结束指示.