1

我尝试从“C++ 标准库”的第 107 页实现流迭代器的示例。我被困在这条线上:

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

程序在这里一直从控制台读取数据,但不会传递到下一行。我如何继续超越这一点?

4

2 回答 2

2

来自 cppreference:

默认构造std::istream_iterator的称为 end-of-stream迭代器。当有效值std::istream_iterator 到达底层流的末尾时,它就等于流结束 迭代器。取消引用或增加它会进一步调用未定义的行为

加粗

换句话说,std::istream_iterator<string>(std::cin)一直持续到输入结束std::cin。这不会发生在行尾,而是发生在文件末尾。在控制台中,有特定的命令可以触发 EOF

在 UNIX 系统中是Ctrl+ D,在 Windows 中是Ctrl+ Z

于 2018-05-10T04:26:58.337 回答
0

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

对于所有其他类型的输入流,情况也是如此。

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

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

于 2018-05-10T04:32:35.943 回答