C++ Iostreams 用法详解(四)缓冲区

    添加时间:2013-5-28 点击量:

    续:

    C++ Iostreams 用法详解(一)整体把握

    C++ Iostreams 用法详解(二)标准入输出

    C++ Iostreams 用法详解(三)状况标记位

    期中测验终于告一段落,再来持续写咯。

    在前面说到过每一个iostream对象都有一个缓冲区,我们称之为流缓冲区,那个这个所谓的流缓冲区是怎么存在的呢?iostreams中将该流缓冲区抽象为一个类,即streambuf类。

    每个iostream的类都邑包含一个指向streambuf对象的指针,这也就意味着我们可以直接的去接见到这个指针,并向该streambuf对象发送消息等(然则一般景象下我们并不须要如许做)。

    既然说我们可以获得这个指针,那isotreams类当然会供给接见的接口了,这就是const成员函数rdbuf(),它会返回iostream对象所有的streambuf也就是缓冲区的指针。那这个缓冲区的指针有什么用呢?最常用的就是直接对其进行输入输出操纵,看下面的例子:

    1.txt内容:
    
    hello world~~!!
    my name is zorro.
    nice to meet you~






    int main() {


        ifstream fin("1.txt");


        cout << fin.rdbuf() << endl;


        system("pause");


        return 0;


    }




    上方的法度输出为:





    可见对这个streambuf对象的指针进行输出操纵,直接输出了缓冲区的所有内容,这是个很便利的功能。然则要重视的是,对rdbuf()返回的指针进行输出,必然获得的是全部缓冲区的内容吗?再看下面的例子:





    int main() {


        ifstream fin("1.txt");


        string str;


        fin >> str;


        cout << fin.rdbuf() << endl;


        system("pause");


        return 0;


    }





    上方的法度输出为:





    可见对rdbuf()进行输出获得的并不必然是全部缓冲区的内容。为了对这个器材进行申明,我们必须先要懂得缓冲区拥有的两个指针,我们一般称之为get指针和put指针。



    对于streambuf类(其实就是basic_streambuf<char>类),可以看出它的操纵是以字节(char)为单位的,所以get指针与put指针也是以字节为单位移动的。get指针指向的是缓冲区中下一个将要提取的字节,put指针指向的是向缓冲区中输出数据的下一个地位。可以经由过程成员函数seekg来移动get指针,seekp来移动put指针。当然从上方的描述我们可以看到,get指针是对输入的操纵,put指针是对输出的操纵,所以在类似ifstream如许的输入功能类中,是没有seekp函数只有seekg函数的,同样在ofstream也只有seekp函数没有seekg的。看下面的例子:





    int main() {


        ifstream fin("1.txt");


        string str;


        fin >> str;


        fin.seekg(2,ios::beg);


        cout << fin.rdbuf() << endl;


        system("pause");


        return 0;


    }





    这个法度的输出为:





    可见对于rdbuf()返回的指针的输出,并不是直接输出缓冲区中的所有内容,而是输出get指针后面的内容。



    iostream同样供给了成员函数tellg和tellp,这两个函数返回的是当前get指针和put指针的地位,返回的类型是streampos,它们同样很有效,可以用到姑且存储一个地位。看下面的例子:





    #define PRINTCURPOS(in) cout << "cur pos:" << in.tellg() << endl


    #define PRINTANDEXEC(st) cout << #st << endl; st


    int main() {


        PRINTANDEXEC(ifstream fin("1.txt"));


        PRINTANDEXEC(string str);


        PRINTCURPOS(fin);


        PRINTANDEXEC(fin >> str);


        PRINTCURPOS(fin);


        PRINTANDEXEC(fin.seekg(2,ios::beg));


        PRINTCURPOS(fin);


        PRINTANDEXEC(cout << fin.rdbuf() << endl);


        PRINTCURPOS(fin);


        system("pause");


        return 0;


    }





    上方的法度输出为:





    以上只演示了get指针的的应用,关于put指针的应用跟get指针差不久不多,就不赘述了。

    我所有的自负皆来自我的自卑,所有的英雄气概都来自于我的软弱。嘴里振振有词是因为心里满是怀疑,深情是因为痛恨自己无情。这世界没有一件事情是虚空而生的,站在光里,背后就会有阴影,这深夜里一片寂静,是因为你还没有听见声音。—— 马良《坦白书》
    分享到: