【问题标题】:Using istream_iterator to read strings使用 istream_iterator 读取字符串
【发布时间】:2014-08-06 14:07:08
【问题描述】:

我不明白通过迭代器读取字符串与直接读取字符串有何不同。为了举例说明,请考虑以下代码:

#include <iostream>
#include <string>
#include <iterator>

using namespace std;

int main() 
{
    string str{istream_iterator<char>(cin),{}};
    cout << str << endl;

    string str1;
    cin >> str1;
    cout << str1 << endl;
}

它的作用很明显,它使用istream_iterator 读取str,并通过传统方法读取str1。我有两个问题:

  1. 通过字符串迭代器结束读取的唯一方法是发送CTRL+D (Unix),这也会终止程序,因此不会执行第二部分。有没有办法解决这个问题?
  2. 使用迭代器读取时,输入空格(空格、\t、\n)无关紧要,迭代器会继续读取。为什么这种行为与直接通过cin &gt;&gt; 阅读时的行为不同?

【问题讨论】:

  • 在 C++03 中试试这个 string str{istream_iterator&lt;char&gt;(cin),{}};
  • 哎呀,我已经习惯花括号初始化了
  • @TemplateRex 不用担心 :) 我只是使用了 C++11 的特定功能,这就是标签的原因。当然问题不在于 C++11

标签: c++ string c++11 istream-iterator


【解决方案1】:

我不明白通过迭代器读取字符串与直接读取字符串有何不同。

您的示例中的不同之处在于,第一个读取整个流,而第二个读取单个单词(直到第一个空格)。

更一般地说,迭代器可用于填充其他容器(例如,使用 istream_iterator&lt;int&gt; 填充 vector&lt;int&gt;),或直接传递给使用前向迭代器的算法。

通过字符串迭代器结束读取的唯一方法是发送CTRL+D(Unix),这也会终止程序

它不会终止程序,它只是关闭输入流。但是这样做之后,您将无法从输入中读取任何其他内容;就目前而言,您的程序没有意义,因为它试图读取超出 cin 末尾的内容。

使用迭代器读取时,输入空格(空格、\t、\n)无关紧要,迭代器会继续读取。为什么这种行为与直接通过cin &gt;&gt; 阅读时的行为不同?

因为这就是 &gt;&gt; 被定义为使用字符串的方式。

【讨论】:

  • 谢谢,收到第二部分。但是我不能通过迭代器停止阅读。 CTRL+D 退出,CTRL+Z 只是停止进程(UNIX)
  • @vsoftco:对不起,我错了,你想要CRTL-D。但在那之后您将无法从输入中读取,因为没有更多的输入。
  • Mike:好的,所以基本上使用迭代器通过stringstring 中构造/插入元素只是一个坏主意......但至少有任何方法可以在之后不退出程序CTRL+D?我尝试了cin.ignorecin.reset,但没有成功。
  • @vsoftco:如果你想消费整个流,这是个好主意,如果你想做其他事情,这是个坏主意。
  • 是的,我明白了,谢谢。同样,我仍然不知道的唯一一件事是如何在 CTRL+D 之后继续程序
【解决方案2】:
  1. 如果您已到达信息流的末尾,则无法再阅读任何内容了。

  2. 范围构造函数中提供的结束迭代器表示输入的结束。当遇到无效字符或流的结尾(找到EOF)时,开始迭代器将等于结束迭代器,这就是它停止的方式。流迭代器确实会丢弃空格,因此如果您打印字符串,它应该不包含空格。

    第二次提取格式化使用空格来分隔输入,这就是为什么只读取一个单词。

【讨论】:

  • 我在两次读取之间也使用了cin.clear(); cin.ignore();,但在得到CTRL+D后仍然无法停止退出。理解了第二部分,但如果不退出/停止程序,就无法通过迭代器退出读取。
  • @vsoftco 我以为您使用的是流缓冲区迭代器,而不是流迭代器。您可以输入空格,但仍会被丢弃。
  • cin.clear() 在输入流关闭后不会重新打开它。第一次读取会消耗整个流,因此之后没有任何内容可读取。
猜你喜欢
  • 1970-01-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-14
  • 1970-01-01
相关资源
最近更新 更多