istream_iterator 复制示例一直在等待输入

istream_iterator copy example keeps waiting for input

我尝试实现 "The C++ Standard Library" 第 107 页中的流迭代器示例。我卡在这条线上:

copy (istream_iterator<string>(cin), istream_iterator<string>(), back_inserter(coll)); 

程序在此处继续从控制台读取数据,但不会传递到下一行。我该如何继续过这一点?

From cppreference:

The default-constructed std::istream_iterator is known as the end-of-stream iterator. When a valid std::istream_iterator reaches the end of the underlying stream, it becomes equal to the end-of-stream iterator. Dereferencing or incrementing it further invokes undefined behavior

加粗

换句话说,std::istream_iterator<string>(std::cin) 一直持续到 std::cin 的输入结束。这不会发生在行尾,而是在 文件末尾。 在控制台中,有 specific commands to trigger the EOF:

In UNIX systems it is Ctrl+D, in Windows Ctrl+Z.

举个例子,如果你创建了一个 int 的输入流,那么你会给出像 - 45 56 45345 555 ..... 这样的输入,所以在所有这些情况下,输入流的读取操作将已返回真值 - while (cin>>var) { } while 语句在获得有效输入时不会停止,因此要停止读取字符,我们给它以下输入,... 54 56 3545 | ,一旦它收到一个特殊字符,while 循环就会停止,因为条件 returns false.

所有其他类型的输入流也是如此。

所以我假设你明白为什么你的字符串类型输入流永远不会停止输入,因为每个可能的输入都可以被认为是字符串。

这个问题的解决方案是使用 "ctrl + D in UNIX" 和 "ctrl + Z in windows",因为它在 while 循环的条件下给出 NULL,这意味着 false,因此停止读取字符串输入。