使用istream_iterator读取字符串

时间:2014-08-06 14:07:09

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

我并不完全明白如何通过迭代器读取字符串与直接读取字符串有什么不同。举例来说,请考虑以下代码:

#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;
}

显而易见的是,它使用str读取istream_iterator,并通过传统方法读取str1。我有两个问题:

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

2 个答案:

答案 0 :(得分:3)

  1. 如果您已经到达流的末尾,则无法阅读更多信息。

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

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

答案 1 :(得分:3)

  

我不确切地知道如何通过迭代器读取字符串与直接读取字符串有什么不同。

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

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

  

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

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

  

当使用迭代器读取时,如果我输入空格(空格,\ t,\ n),迭代器继续读取并不重要。为什么这种行为与通过cin >>直接阅读的行为不同?

因为>>定义为使用字符串。