-
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指针差不久不多,就不赘述了。
我所有的自负皆来自我的自卑,所有的英雄气概都来自于我的软弱。嘴里振振有词是因为心里满是怀疑,深情是因为痛恨自己无情。这世界没有一件事情是虚空而生的,站在光里,背后就会有阴影,这深夜里一片寂静,是因为你还没有听见声音。—— 马良《坦白书》