使用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
。我有两个问题:
- 通过字符串迭代器结束读取的唯一方法是发送一个
CTRL+D
(Unix),它也会终止程序,因此第二部分不会执行。还有别的办法吗? - 当使用迭代器读取时,无论我是否输入空白(space, t, n),迭代器都会继续读取。为什么这种行为不同于直接通过
cin >>
读取时的行为?
我不太明白通过迭代器读取字符串和直接读取字符串有什么不同。
您的示例中的区别在于,第一个读取整个流,而第二个读取单个单词(直到第一个空格)。
一般来说,迭代器可以用来填充其他容器(例如用istream_iterator<int>
填充vector<int>
),或者直接传递给使用前向迭代器的算法。
通过字符串迭代器结束读取的唯一方法是发送一个
CTRL+D
(Unix),它也终止程序
它不终止程序,它只是关闭输入流。但是你不能从输入中读取任何东西;就目前情况而言,您的程序没有意义,因为它试图读取cin
末尾以外的内容。
当使用迭代器读取时,不管我是否输入空白(space, t, n),迭代器都会继续读取。为什么这种行为不同于直接通过
cin >>
读取时的行为?
因为>>
就是这样被定义来处理字符串的
-
如果你已经到达流的末尾,那么就没有什么可读的了。
-
range构造函数中提供的end迭代器表示输入的结束。当遇到无效字符或流的结尾(找到
EOF
)时,开始迭代器将等于结束迭代器,并以此停止。流迭代器会丢弃空格,所以如果你打印字符串,它应该不包含空格。第二个提取使用空格分隔输入,这就是为什么只读取一个单词的原因。
相关文章:
- 如何使用Luacneneneba API正确读取字符串和表参数
- 如何从二进制文件中读取字符串
- 如何在 c++ 中使用 getline 从文件中读取字符串?
- 读取字符串文本输入以创建 2D 矢量
- 罗马数字到阿拉伯语 (vinculum) - 读取字符串中的字符
- C++:从文件中读取字符串和整数,并获得最大数字
- C++,从文件中读取字符串,分段错误
- 如果语句错误地读取字符串,则始终在第一个条件返回
- 如何从内存中读取字符串?
- 如何创建一个C++程序来读取字符串数组中的信息,然后将其排序到类中?
- 我需要C++读取字符串数组中每个单词的第一个字母
- 读取字符串C++的字符时出错
- 读取字符串直到标志 (C++)
- 读取字符串字符时出错 - 对于数组中的字符串值
- C++输入文件流无法从文件中读取字符串
- 读取字符串字符时出错
- 如何读取<字符串,矢量<对<int,字符串的映射>>>
- 如何使此函数使用 getline 读取字符串并使用 int 执行相同的行为?
- C++ 使用 Strtok 读取字符串字符时出错
- 使用 getline 读取字符串,但每行中都有换行符