使用流迭代器操作cin,cout 实现输出输出

istream_iterator 用来读取输入流,ostream_iterator 用于写输出流;

其构造函数如下:

istream_iterator<T> in(strm)    //从输入流strm 创建读取T类型对象的istream_iterator 对象;

istream_iterator<T> in;      istream_iterator 对象的超出末端迭代器;

ostream_iterator<T> out(strm)    //创建将T类型对象写道strm流的ostream_iterator 对象;

osteam_iterator<T> out(strm,delim)   //创建将T类型对象写入strm流的ostream_iterator 对象,在写入过程中,以delim 为元素分隔符,delim 是C风格字符串;


eg1 从标准输入读取一系列整数,存放在一个vector 容器中,再输出该容器的内容.

int main(int argc, char* argv[])
{
   istream_iterator<int> in_iter(cin);
   istream_iterator<int> end_iter;
   vector<int> ivec(in_iter,end_iter);



   ostream_iterator<int> out_iter(cout,"\n");
   for(vector<int>::iterator i = ivec.begin() ;i!= ivec.end() ; ++i)
   {
       *out_iter++ = *i;
   }

   return 0;
}




eg2.  读取一个文件的内容,使用copy 算法将文件内容输出到标准输出

int main(int argc, char* argv[])
{
   fstream fin;
   fin.open("C:\\Users\\lenovo\\Desktop\\log.txt",ios::in);
   istream_iterator<string> in_iter(fin),end_iter;
   ostream_iterator<string> out_iter(cout,"\n");
   copy(in_iter,end_iter,out_iter);
   fin.close();

   return 0;
}



eg3.

使用istream_iterator 对象从标准输入读入一系列整数,使用ostream_iterator 对象将其中的奇数写到一个文件,偶数写到另一个文件

#include <iostream>
#include <iterator>
#include <algorithm>
#include <fstream>

using namespace std;


int main(int argc,char* argv[])
{


   istream_iterator<int> in_iter(cin),end_iter;
   fstream file1,file2;
   file1.open("1.txt",ios::out);
   file2.open("2.txt",ios::out);
   ostream_iterator<int> out1(file1,"\n");
   ostream_iterator<int> out2(file2,"\n");
   copy_if(in_iter,end_iter,out1,[](int i){return !(i%2 == 0);});
   copy_if(in_iter,end_iter,out2,[](int i){return i%2 == 0;});

    return 0;
}



ps. 目前上面eg3的程序还有bug ,copy_if 连着两次调用,第二次调用没有起到期望的效果

上面联系两次调用copy_if() 出现问题,其原因是:

An InputIterator is an Iterator that can read from the pointed-to element. InputIterators only guarantee validity for single pass algorithms: once an InputIterator i has been incremented, all copies of its previous value may be invalidated.


解决办法是先将标准输入的内容保存在容器中:
   istream_iterator<int> in_iter(cin),end_iter;
   vector<int> ivec(in_iter,end_iter);
   fstream file1,file2;
   file1.open("1.txt",ios::out);
   file2.open("2.txt",ios::out);
   ostream_iterator<int> out1(file1,"\n");
   ostream_iterator<int> out2(file2,"\n");
   copy_if(ivec.begin(),ivec.end(),out1,[](int i){return !(i%2 == 0);});
   copy_if(ivec.begin(),ivec.end(),out2,[](int i){return i%2 == 0;});





  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值