副标题#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; }
上面的措施输出为:
#p#副标题#e#
可见对这个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指针差不多,就不赘述了。