您可以很容易地重定向 stdout/stderr:创建一个派生自 std::basic_streambuf 并重载 xsputn() 和 overflow() 的类,然后使用例如 std::cerr.rdbuf( instanceOfYourRedirectClass ) 将所有 stderr 输出重定向到回调函数你供应。
这是我使用的简化版本;根据您的需要,您可能需要添加额外的逻辑来处理行尾字符等的处理。
template< class Elem = char, class Tr = std::char_traits<Elem> >
class Redirector : public std::basic_streambuf<Elem, Tr>
{
typedef void (*pfncb) ( const Elem*, std::streamsize );
public:
Redirector( std::ostream& a_Stream, pfncb a_Cb ) :
m_Stream( a_Stream ),
m_pCbFunc( a_Cb ),
{
//redirect stream
m_pBuf = m_Stream.rdbuf( this );
};
~Redirector()
{
//restore stream
m_Stream.rdbuf( m_pBuf );
}
std::streamsize xsputn( const Elem* _Ptr, std::streamsize _Count )
{
m_pCbFunc( _Ptr, _Count );
return _Count;
}
typename Tr::int_type overflow( typename Tr::int_type v )
{
Elem ch = Tr::to_char_type( v );
m_pCbFunc( &ch, 1 );
return Tr::not_eof( v );
}
protected:
std::basic_ostream<Elem, Tr>& m_Stream;
std::streambuf* m_pBuf;
pfncb m_pCbFunc;
};
用法:
void outcallback( const char *ptr, std::streamsize count )
{
if( *ptr != gc_cEOL ) //ignore eof
OutputDebugString( ptr );
}
Redirector<> redirect( std::cout, mycallback );