搜索周围,除了重定向到文件之外找不到任何关于此的信息,所以希望有人可以帮助我。
我有一个启动并挂钩另一个进程的控制台应用程序,默认情况下,新进程输出显示在第一个控制台应用程序中。
我想要做的是为所有输出添加一个日期时间值,问题是我不控制子进程(第三方应用程序)的输出,因此为所有打印值添加日期时间的简单解决方案不可用。是否可以将字符串添加到所有stdout
?
答案 0 :(得分:0)
因为你确认了C ++(这暗示了一个解决方案)
std::cout
是我们所需要的,而不是stdout
):
明显的解决方案是过滤streambuf:
class TimeStampStreambuf : public std::streambuf
{
std::streambuf* myDest;
std::ostream* myOwner;
bool myIsAtStartOfLine;
protected:
int overflow( int ch )
{
// To allow truly empty lines, otherwise drop the
// first condition...
if ( ch != '\n' && myIsAtStartOfLine ) {
std::string tmp = now();
// function now() should return the timestamp as a string
myDest->sputn( tmp.data(), tmp.size() );
}
myIsAtStartOfLine = ch == '\n';
ch = myDest->sputc( ch );
return ch;
}
public:
TimeStampStreambuf( std::streambuf* dest )
: myDest( dest )
, myOwner( nullptr )
, myIsAtStartOfLine( false )
{
}
TimeStampStreambuf( std::ostream& owner )
: myDest( dest.rdbuf() )
, myOwner( &owner )
, myIsAtStartOfLine( false )
{
myOwner->rdbuf( this );
}
~TimeStampStreambuf()
{
if ( myOwner != nullptr ) {
myOwner->rdbuf( myDest );
}
}
};
安装它:
// scoped:
TimeStampStreambuf anyName( std::cout );
// Time stamping will be turned off when variable goes out
// of scope.
// unscoped:
std::streambuf* savedStreambuf = std::cout.rdbuf();
TimeStampStreambuf name( savedStreambuf );
// In this case, you have to restore the original streambuf
// yourself before calling exit.
据我所知,解释这一点的文章(来自 C ++ 报告,1998年9月)没有在线。
编辑:
我实际上找到了它们: http://gabisoft.free.fr/articles-en.html。我简直不敢相信 链接仍然有效;我有一个帐户已经好几年了 免费。