2009-06-02 30 views
1

有没有人有一个如何重新定义在clog中构建的C++的例子,而是有一个新的关联rdbuf(),它被处理成原来的clog.rdbuf()和一个ofstream对象的rdbuf()磁盘上的日志文件。如何重新定义clog的rdbuf()作为发球的原始rdbuf()和日志文件的发球?

其目的是让代码始终使用std :: clog,但将其转到默认的阻塞目标以及磁盘上的日志文件。

谢谢。

- 威廉

+0

请不要问相同的问题两次:http://stackoverflow.com/questions/937805/how-to-redefine-clog-to-tee-to-original-clog-and-a-log-file – lothar 2009-06-02 23:32:18

回答

2

您必须编写自定义流缓冲派生类。让它将数据吐出到你的ofstream的rdbuf和你原来的clog rdbuf。

编写自定义流缓冲的一般示例:

http://www.dreamincode.net/code/snippet2499.htm

积攒新的流缓存可以做如下:

// grab buffer for clog 
std::streambuf* oldClogBuf = std::clog.rdbuf(); 

// create custom buffer which feeds both clog and an ofstream 
CustomBuffer* customBuf = new CustomBuffer(oldClogBuf); 

// stash custom buffer 
std::clog.rdbuf(customBuf); 

...do stuff... 

// restore original clog buffer 
std::clog.rdbuf(oldClogBuf); 

您可以通过使用使整个事情更稳健RAII成语来管理缓冲区切换。