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));
程序在此处继续从控制台读取数据,但不会传递到下一行。我该如何继续过这一点?
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,因此停止读取字符串输入。
我尝试实现 "The C++ Standard Library" 第 107 页中的流迭代器示例。我卡在这条线上:
copy (istream_iterator<string>(cin), istream_iterator<string>(), back_inserter(coll));
程序在此处继续从控制台读取数据,但不会传递到下一行。我该如何继续过这一点?
The default-constructed
std::istream_iterator
is known as the end-of-stream iterator. When a validstd::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,因此停止读取字符串输入。