C ++将DateTime预先添加到控制台输出

时间:2013-07-11 15:43:29

标签: c++ stdout prepend

搜索周围,除了重定向到文件之外找不到任何关于此的信息,所以希望有人可以帮助我。

我有一个启动并挂钩另一个进程的控制台应用程序,默认情况下,新进程输出显示在第一个控制台应用程序中。 我想要做的是为所有输出添加一个日期时间值,问题是我不控制子进程(第三方应用程序)的输出,因此为所有打印值添加日期时间的简单解决方案不可用。是否可以将字符串添加到所有stdout

1 个答案:

答案 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。我简直不敢相信 链接仍然有效;我有一个帐户已经好几年了 免费。