源码之前,了无秘密。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | //~ demo.cpp #include <iostream> #include <fstream> #include <string> #include <streambuf> using namespace std; //~ 测试代码 :) int main() { ifstream in("demo.cpp"); char buffer[4096]="original content in this buffer"; cout<<buffer<<endl; streambuf * ptrbuff = in.rdbuf(); //~ 将streambuf与文件句柄关联 ptrbuf->pubsetbuf(bufer, 4096); //~ 设置缓冲区,即设置in的缓冲区 cout<<buffer<<endl; //~ 此时bufer里面的内容还是original content in this buffer string str; in>>str; //~ 真正要输入时bufer才被填充为in的内容 cout<<str<<endl; cout<<buffer<<endl; return 0; } |
另外,还有一个filebuf,用法相近。看了很多C++方面的书,从来没有那本书对I/O流做过详细的介绍。C里面有setbuf可以修改缓冲区,但我在fstream里面却没看到这么个setbuf,rdbuf倒是有一个,它返回streambuf类型的指针。搜索streambuf的用法,无果,MSDN里面看到streambuf有一个setbuf的成员,甚喜。编译器说,setbuf是私有的,再看MSDN,还有一个pubsetbuf,哟西!