- 流类库
- 流库是用继承方法建立的输入输出类库
- 流库具有两个平行的基类:streambuf和ios类,所有流类均已两者之一作为基类
- streambuf类提供对缓冲区的低级操作:设置缓冲区,对缓冲区指针操作,向缓冲区存/取字符
- ios类以及派生类提供使用流类的接口,支持对streambuf的缓冲区输入/输出的格式化或者非格式化转换。
- 标准流
- 标准输入流cin输入到内存,标准输出流cout到屏幕
- 标准流为用户常用的外部设备提供与内存之间的通信通道,对数据进行解释和传输,提供必要的数据缓冲。
- cin:istream类的对象,通常连向键盘,可以重定向
- cout:ostream类的对象,通常连向显示器,可以重定向
- cerr:ostream类的对象,连向显示器,不可以重定向
- clog:ostream类的对象,连向打印机,不可以重定向
- c语言重定向到文件
- c++中流是一个对象,所以任何有流这种行为的对象也是流对象
- 流对象主要分为三种类型:
- istream: 主要是从流中执行输入操作
- ostream:主要是从流中执行输出操作
- iostream:主要是从流中执行输入输出操作
- 每个流对象都关联一个流buffer,程序一般从buffer中读取数据,所以如果要重定向流,只需要把buffer对象指向另外一个流即可
- 所有的流对象都关联了一个类成员数据streambuf,它就是stream的缓冲区(buffer)。C++读取输入输出的时候是从buffer中读取,而不是源数据流读取。
- 函数介绍
- c++重定向到文件
freopen(“data.in”, “r”, stdin); freopen(“data.out”, “w”, stdout); //这样就把标准输入重定向到了data.in文件,标准输出重定向到了data.out文件。 //这两句代码之后,scanf函数就会从data.in文件里读,而printf函数就会输出到data.out文件里了。
stream_object.rdbuf(); //返回流对象buffer stream_object.rdbuf(streambuf * p); //绑定流对象buffer
//如果不传参数,那么直接返回流对象的buffer指针。如果传递了某个流对象的
//buffer指针,那么将当前的流对象绑定到那个传递过来的流对象的buffer上
streambuf *backup; ifstream fin; fin.open("test.txt"); backup = cin.rdbuf(); // 备份下 cin's streambuf cin.rdbuf(fin.rdbuf()); // assign file’s streambuf to cin //恢复原来的输入流 cin.rdbuf(backup); // 把cin又重定向回了控制台 //fin.close();