当前位置:天才代写 > tutorial > C语言/C++ 教程 > C++ Iostreams用法详解(四)缓冲区

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

2017-11-02 08:00 星期四 所属: C语言/C++ 教程 浏览:735

副标题#e#

在前面说到过每一个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;
    
}

上面的措施输出为:

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


#p#副标题#e#

可见对这个streambuf工具的指 针举办输出操纵,直接输出了缓冲区的所有内容,这是个很利便的成果。可是要留意的是,对rdbuf()返回的 指针举办输出,必然获得的是整个缓冲区的内容吗?再看下面的例子:

int main() {
    
    ifstream fin("1.txt");
    
    string str;
    
    fin >> str;
    
    cout << fin.rdbuf() << endl;
    
    system("pause");
    
    return 0;
    
}

上面的措施输出为:

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

可见对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;
    
}

这个措施的输出为:

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

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

#p#副标题#e#

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;
    
}

上面的措施输出为:

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

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

 

    关键字:

天才代写-代写联系方式