C++ 中流 (stream) 是一个对象, 所以任何有流这种行为的对象也是流对象.
流主要分为三种类型:
istream: 主要是从流中执行输入操作
ostream: 主要是从流中执行输出操作
iostream: 主要是从流中执行输入输出操作
每个流对象都关联一个流 buffer, 程序一般从 buffer 中读取数据, 所以如果要重定向流, 只需要把 buffer 对象指向另外一个流即可.
所有的流对象都关联了一个类成员数据 streambuf, 它就是 stream 的缓冲区(buffer).C++ 读取输入输出的时候是从 buffer 中读取, 而不是源数据流读取.
我们执行重定向操作使用 ios::rdbuf()方法. 对于这个方法, 如果不传参数, 那么直接返回流对象的 buffer 指针. 如果传递了某个流对象的 buffer 指针, 那么将当前的流对象绑定到那个传递过来的流对象的 buffer 上.
例子:
- stream_object.rdbuf(); // 返回流对象 buffer
- stream_object.rdbuf(streambuf * p); // 绑定流对象 buffer
实际操作:
- // cout 重定向到文件
- #include <fstream>
- #include <iostream>
- #include <string>
- using namespace std;
- int main()
- {
- fstream file; // 定义 fstream 对象
- file.open("D:\cout.txt", ios::out); // 打开文件, 并绑定到 ios::out 对象
- string line;
- // 先获取 cout,cin 的 buffer 指针
- streambuf *stream_buffer_cout = cout.rdbuf();
- streambuf *stream_buffer_cin = cin.rdbuf();
- // 获取文件的 buffer 指针
- streambuf *stream_buffer_file = file.rdbuf();
- // cout 重定向到文件
- cout.rdbuf(stream_buffer_file);
- cout << "This line written to file" << endl;
- // cout 重定向到 cout, 即输出到屏幕
- cout.rdbuf(stream_buffer_cout);
- cout << "This line is written to screen" << endl;
- file.close(); // 关闭文件
- return 0;
- }
来源: https://www.cnblogs.com/ranwuer/p/9550010.html