四处搜索,除了重定向到文件之外找不到任何关于此的信息,所以希望有人可以帮助我。
我有一个控制台应用程序,它启动并挂接另一个进程,默认情况下,新进程输出显示在第一个控制台应用程序中。我想做的是为所有输出添加一个日期时间值,问题是我不控制子进程(第 3 方应用程序)的输出,因此向所有打印值添加日期时间的简单解决方案不可用. 是否可以在 all 前面添加一个字符串stdout
?
由于您确认了 C++(这意味着需要的解决方案
std::cout
,而不是stdout
):显而易见的解决方案是过滤流缓冲区:
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++ Reports,1998 年 9 月)不在网上。
编辑:
我实际上找到了它们: http: //gabisoft.free.fr/articles-en.html。我不敢相信链接仍然有效;自从我拥有 Free 帐户以来已经有好几年了。