zoukankan      html  css  js  c++  java
  • 标准C++ I/O库 迭代器让数据自由流动 V8

    IO库的组成

    三种流

    C++的IO库以流对象为实体。主要有三种流:

    (1)标准输入输出流     

    (2)文件输入输出流       

    (3)字符串输入输出流

    流迭代器     

    输入输出流迭代器
    instream_iterator<type>
    ostream_iterator<type>

    从控制台到容器
    istream_iterator<T> first(cin);
    istream_iterator<T> last;
    copy(first,last,back_inserter(v));//调用容器的push_back方法
    vector<string> vs(first,last);
    从容器到控制台
    ostream_iterator<T> first(cout," ");
    copy(v.begin(),v.end(),first);
    从文件到容器
    ifstream fin("inputfile.txt");
    istream_iterator<T> first(fin),last;
    vector<T> v(first,last);
    从文件到string 
    ifstream fin("inputfile.txt");
    //以下再读取字符的时候文件里的空白字符也会放到string中
    istreambuf_iterator<char> first(fin),last;//注意与上面一段的差别
    string v(first,last);
    //假设使用istream_iterator<char> first(fin),last;则会从文件里用
    //>>操作符读取char变量放到string中,空白符丢失
    从容器到文件
    ofstream fout("outputfile.txt");
    ostream_iterator<T> first(fout," ");//注意这里不须要last
    copy(v.begin(),v.end(),first);

    流对象的状态

    s.eof()        //流结束状态,输入流中已经读全然部数据。再读一次就会是eof为true

    s.fail()        //变量转换失败clear(ios::failbit)

    s.bad()         //

    s.clear()       //全部状态重置为有效


    容器都有自己的迭代器

                  

    容器                    

    vector 

    string 

    deque 

    list


      v.begin()      v.end() 

     l.cbegin()    l.cend()          


    流的迭代器

    流迭代器用来写入流,或者从读流对象读数据,输入流迭代器使用strm>>t操作,将数据写到变量中。你看看>>操作符像不像箭头,这个箭头代表了数据的流向,C++作者说的。呵呵。

    相同输出流使用<<操作符,将变量的数据写到流中。

                                             输入流迭代器                                                                                     输出流迭代器

                istream_iterator<T> iter_begin(strm),iter_end;                          ostream_iterator<T> iter_begin(strm),iter_end;/

                                  以变量为单位。空白符将会被吃掉                                        以变量为单位,空白符将会被吃掉

                 istreambuf_iterator<char> iter_begin(strm),iter_end;           ostreambuf_iterator<char> iter_begin(strm),iter_end;

                           以字符为单位,空白符将会依照一个单位处理                以字符为单位,空白符将会依照一个单位处理


    字符流迭代器演示样例

    #include <iostream>
    #include <string>
    #include <sstream>
    #include <iterator>
    #include <algorithm>
    using namespace std;
    
    int main(int , char**)
    {
        std::string str("a b c 123 !");
        cout<<str<<endl;
    
        stringstream ss(str);
        istreambuf_iterator<char> itrBegin(ss),itrEnd;
        copy(itrBegin, itrEnd, ostream_iterator<char>(cout));
    
        return 0;
    
    }

    C++打印main.cpp源码

    #include <iostream>
    #include <fstream>
    #include <algorithm>
    #include <iterator>
    using namespace std;
    
    int main(int argv, char** argc) 
    {
    	ifstream fin("main.cpp");
    	//buf迭代器会得到空白字符
    	istreambuf_iterator<char> itrFile(fin), endFile;
    	//输出迭代器只迭代一个char就可以,不须要是buf迭代器
    	ostream_iterator<char> itrCout(cout);
    	copy(itrFile, endFile, itrCout);	
    	return 0;
    }

    C++打印main.cpp源码

    (先放到字符串中,再打印字符串)

    #include <iostream>  
    #include <fstream>  
    #include <algorithm>  
    #include <iterator>  
    using namespace std;  
    
    int main(int argv, char** argc)   
    {  
    	ifstream fin("main.cpp");  
    	string str;
    	istreambuf_iterator<char> itrFileBegin(fin), itrFileEnd;  
    	copy(itrFileBegin, itrFileEnd, back_inserter(str));//把源文件内的代码(包含字符和空格)放到字符串中
    	//仅仅有遇到''才会结束,而源文件里的空格字符(' '相应的数值为32)
    	//,回车字符,Tab字符相应的值都不是'',所以都能被打印出来
    	cout<<str.c_str()<<endl;
    	return 0;  
    } 


    数据的流动

                                                       copy(iter_from_begin,iter_from_end,iter_dest_begin);

                                       <iterator>                                                                                            <iterator>

                inserter(strm)             //v.insert                                             istream_iterator<T> iter_begin(strm),iter_end;   

                back_inserter(strm)  //v.push_back                                  istreambuf_iterator<char> iter_begin(strm),iter_end;    

                front_inserter(strm)  //v.push_front

                    <------------------------------------------------------        数据             < ---------------------------------------------------

    容器                                                                                                                                                                               流对象

    vector                                                                                                                                                                                    fstream

    string                                                                                                                                                                           sstream

    list     deque                                                                                                                                                                        cin  cout

               ---------------------------------------------------------->         数据           ---------------------------------------------------->

                                     v.begin()      v.end()                                          ostream_iterator<T> iter_begin(strm),iter_end;/

                                     l.cbegin()    l.cend()                                         ostreambuf_iterator<char> iter_begin(strm),iter_end;

                                                                copy(iter_from_begin,iter_from_end,iter_dest_begin);

    演示样例:

    #include <iostream>
    #include <sstream>
    #include <string>
    #include <vector>
    #include <algorithm>
    #include <iterator>
    using namespace std;
    
    int main(int argc, char *argv[]) 
    {
        int temp_int[5] = {1,2,3,4,5};
        vector<int> vector_int;
        //array to vector
        copy(temp_int,temp_int+sizeof(temp_int)/sizeof(int),back_inserter(vector_int));
        //vector to cout
        copy(vector_int.begin(),vector_int.end(),ostream_iterator<int>(cout," "));
        cout<<endl;
        //vector to stringstream
        stringstream strm;
        copy(vector_int.begin(),vector_int.end(),ostream_iterator<int>(strm," "));
        cout<<strm.str()<<endl;
        //stringstream to vector<string>
        vector<string> vector_string;
        copy(istream_iterator<string>(strm),istream_iterator<string>(),back_inserter(vector_string));
        copy(vector_string.begin(),vector_string.end(),ostream_iterator<string>(cout," "));
        cout<<endl;
    
        return 0;
    }
    
    输出例如以下:


    1 2 3 4 5
    1 2 3 4 5
    1 2 3 4 5
    请按随意键继续. . .






  • 相关阅读:
    第十三周进度条
    寻找水军
    第十二周进度条
    学习总结
    第十五周工作总结
    第十四周工作总结
    《梦断代码》阅读笔记03
    个人工作总结20
    个人工作总结19
    个人工作总结18
  • 原文地址:https://www.cnblogs.com/gccbuaa/p/6740692.html
Copyright © 2011-2022 走看看