【问题标题】:istream_iterator copy example keeps waiting for inputistream_iterator 复制示例一直在等待输入
【发布时间】:2018-10-20 06:44:57
【问题描述】:

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

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

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

【问题讨论】:

  • Ctrl+Z 有效。谢谢。
  • 如果其中一个答案回答了您的问题,您可以通过单击复选标记accept it。如果他们没有回答您的问题,您能否发表评论以详细说明您缺少什么?

标签: c++ c++-standard-library istream-iterator


【解决方案1】:

From cppreference:

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

加粗

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 这个答案很难理解。从简短的浏览来看,我相信第一段,你是说这种行为与你写 while (cin &gt;&gt; var) {} 时发生的行为没有什么不同,但并不完全清楚。
    • “因为它附加了一个返回 false 的 NULL”在很多方面都是错误的。它“附加”一个EOF,它不同于NUL,它不同于NULL,它不会“返回false”
    • 感谢您宝贵的cmets,下次我会更加努力地学习我的词汇。
    • 您可以随时尝试编辑此答案以解决我提到的问题。不过,词汇不一定是问题所在。例如,第一段可以使用一些格式,但它有点太罗嗦了——它是一个连续的句子。至于最后一个错误的部分,你也完全可以纠正。
    猜你喜欢
    • 2023-03-10
    • 2017-02-15
    • 2016-07-30
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-22
    相关资源
    最近更新 更多