0

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

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

4

1 回答 1

0

由于您确认了 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 帐户以来已经有好几年了。

于 2013-07-11T17:14:47.880 回答