最近的项目需要把cerr的输出写到文件中去,于是开始找这方面的资料。其实I/O重定向是非常简单的。
base_io有个rdbuf方法,它的定义如下:
basic_streambuf<Elem, Traits> rdbuf() const;
basic_streambuf<Elem, Traits>* rdbuf(basic_streambuf<Elem, Trais> *_Sb);
事实上,每个C++ 的I/O都有一块独立的缓冲区,只有当调用flush时才把其中的内容写入到文件或输出到屏幕,我们只需要把这块缓冲区的指针替换成别的指针就能实现重定向。MSDN给出了一个非常简洁的例子:
main() {
ofstream file("data.txt");
streambuf* x = cout.rdbuf(file.rdbuf());
cout<<"Hello"<<endl; // 这一句将会输出到文件
cout.rdbuf(x);
cout<<"World"<<endl; // 这一句将会输出到屏幕
}
这段代码虽然简单,但要注意,如果I/O的缓冲区不可用,比如上面,在没重新设置cout.rdbuf前就关闭了文件,那么程序Crash掉了。