1,头文件
#include<iterator>
using std::istream_iterator;
using std::ostream_iterator;
流迭代器为类模板。
这类迭代器可与输入输出流绑定在一起,用于迭代遍历所关联的IO流。包括标准输入输出流和文件流。
2,构造函数
istream_iterator<T> in(strm); //创建从输入流strm中读取T类型对象的istream_iterator对象
istream_iterator<T> in;//istream_iterator对象的超出末端迭代器,EOF
ostream_iterator<T> out(strm);//创建从输出流strm中读取T类型对象的ostream_iterator对象
ostream_iterator<T> out(strm, delim);//写入时以delim为分隔符,delim为c风格字符串
流迭代器的操作较少,只有自增、解引用和赋值三个。
除此之外istream_iterator可使用“==”和“!=”操作,通常用来和EOF比较。
istream_iterator不支持比较操作。
任何定义了输入操作符“>>”的类型都可定义istream_iterator,任何定义了输出操作符“<<”的类型都可定义ostream_iterator。
ostream_iterator不提供超出末端迭代器,必须与流绑定在一起,可以为标准输出流或文件流。
3,istream_iterator的用法
istream_iterator<int> cin_it(cin);
istream_iterator<int> cin_end; // EOF
vector<int> ivec(cin_it, cin_end); //一定要记住这种用法!
这种写法免除了对循环语句的使用,让ivec不断从输入流中获取int型对象,直到遇到EOF为止。
4,ostream_iterator的用法
// 1文件操作
ofstream odd_file("odd_file.txt");//生成的文件在当前目录,即工程所在的目录
ofstream even_file("even_file.txt");
//检查文件打开是否成功
if((!odd_file) || (!even_file))
{
cerr << "can't open odd_file or even_file!" << endl;
return EXIT_FAILURE;
}
// 2读入整数
cout << "请输入一系列的正整数:" << endl;
istream_iterator<int> cin_it(cin);
istream_iterator<int> cin_end;
// 3使用ostream_iterator写文件
ostream_iterator<int> odd_iter(odd_file," ");
ostream_iterator<int> even_iter(even_file, "\n");
while (cin_it != cin_end)
{
if (*cin_it % 2 == 0)
{
*even_iter++ = *cin_it++;
}
else
{
*odd_iter++ = *cin_it++;
}
}
even_file.close();
odd_file.close();
注意:给ostream_iterator对象赋值,就相当于向输出流里写东西。当输出流与文件绑定时,即相当于写文件。
所以一旦赋值就没有办法再修改这个值(总不能重写文件吧。。。)
ostream_iterator没有->操作符。(好奇向文件中写类会怎么样 。。。)