使用istream_iterator读取字符串

Using istream_iterator to read strings

本文关键字:读取 字符串 iterator istream 使用      更新时间:2023-10-16

我不太明白通过迭代器读取字符串与直接读取字符串有什么不同。要举例说明,请考虑下面的代码:

#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. 当使用迭代器读取时,无论我是否输入空白(space, t, n),迭代器都会继续读取。为什么这种行为不同于直接通过cin >>读取时的行为?

我不太明白通过迭代器读取字符串和直接读取字符串有什么不同。

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

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

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

它不终止程序,它只是关闭输入流。但是你不能从输入中读取任何东西;就目前情况而言,您的程序没有意义,因为它试图读取cin末尾以外的内容。

当使用迭代器读取时,不管我是否输入空白(space, t, n),迭代器都会继续读取。为什么这种行为不同于直接通过cin >>读取时的行为?

因为>>就是这样被定义来处理字符串的

  1. 如果你已经到达流的末尾,那么就没有什么可读的了。

  2. range构造函数中提供的end迭代器表示输入的结束。当遇到无效字符或流的结尾(找到EOF)时,开始迭代器将等于结束迭代器,并以此停止。流迭代器会丢弃空格,所以如果你打印字符串,它应该不包含空格。

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