我想将两个(或多个)流合成为一个。我的目标是将指向cout
、cerr
和clog
的任何输出也输出到一个文件中,沿着原始流。(例如,当事情被记录到控制台时。关闭后,我希望仍然能够返回并查看输出。)
我想做这样的事情:
class stream_compose : public streambuf, private boost::noncopyable
{
public:
// take two streams, save them in stream_holder,
// this set their buffers to `this`.
stream_compose;
// implement the streambuf interface, routing to both
// ...
private:
// saves the streambuf of an ios class,
// upon destruction restores it, provides
// accessor to saved stream
class stream_holder;
stream_holder mStreamA;
stream_holder mStreamB;
};
这似乎够直接了。main中的调用将类似于:
// anything that goes to cout goes to both cout and the file
stream_compose coutToFile(std::cout, theFile);
// and so on
我也看了boost::iostreams
,但没有看到任何相关的东西。
有没有其他更好/更简单的方法来实现这一点?
3条答案
按热度按时间ha5z0ras1#
如果你想在stdlib中完成这件事,你的设计是正确的。
有一点:不要在每个输出上都连接到每个streambuf,而是实现它,使其使用与给定的streambuf之一相同的put区域,并在溢出和同步时复制到其他streambuf。这将最小化虚拟调用,这是streambufs工作的目标之一。
或者,如果你只想处理stdout和stderr(这是常见的),通过标准的Unix
tee
程序(或你平台上的等效程序)运行你的程序,或者在调用程序时自己做,或者在程序中通过分叉,适当地设置流等。现在,这个测试还远未完成,但它似乎有效:
把它和一个文件放在一起:
t5zmwmid2#
您提到在Boost.IOStreams中没有找到任何内容。你考虑过tee_device吗?
f3temu5u3#
我会写一个自定义的流缓冲区,只是转发数据到所有链接流的缓冲区。