3

我正在尝试istream_iterator用于从cin. 我读过按Ctrl+D发送一个EOF结束输入流的字符。不幸的是,它出了点问题。这是我的代码:

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

  istream_iterator<char> it(cin), eos;
  while (it != eos) clog << *(it++);
}

我正在运行它并输入: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)。

4

2 回答 2

6

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

while (it != eos)
{
    clog << *it;
    it++;
}

这将处理“为什么它不打印最后一个字符”

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

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

于 2011-09-07T17:47:41.763 回答
3

在类 Unix 系统上,键入Ctrl+D仅在行首触发文件结束条件(即,紧接在键入 之后Enter。要在行中间触发文件结束条件,请键入Ctrl+D两次。

于 2011-09-07T17:53:00.480 回答