繁体   English   中英

使用istream_iterator读取字符串

[英]Using istream_iterator to read strings

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

#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 >>直接阅读的行为不同?
  1. 如果您已到达流的末尾,则无法再阅读任何内容。

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

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

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

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

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

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

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

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

因为这是>>如何定义使用字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM