C++ 将日期时间添加到控制台输出

Posted

技术标签:

【中文标题】C++ 将日期时间添加到控制台输出【英文标题】:C++ Prepend DateTime to console output 【发布时间】:2013-07-11 15:43:29 【问题描述】:

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

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

【问题讨论】:

你在这个问题上贴了一个 C++ 标签:你想要stdout (C) 解决方案,还是使用std::cout 的解决方案? (前者是不可能的,至少在便携方面是不可能的;后者相当简单。) 【参考方案1】:

既然你确认了 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。我不敢相信 链接仍然有效;我已经有好几年没有账户了 免费。

【讨论】:

谢谢,但我得到 dest 在“TimeStampStreambuf(std::ostream& owner)”下未定义,将其更改为 owner.rdbuf() 但似乎无法获得任何前置时间。跨度> 第一个是明显的错字---我会修正它。剩下的,你必须发布一个关于你在做什么的问题。我已经在许多应用程序中使用过这种技术,并且从来没有遇到过任何问题(但可能还有其他拼写错误——我在我正在回答的机器上没有实际的来源,并重写了代码记忆)。您还可以查看文章,尤其是第一篇文章,它给出了更完整的实现,并详细解释了发生了什么。

以上是关于C++ 将日期时间添加到控制台输出的主要内容,如果未能解决你的问题,请参考以下文章

在 Windows 中使用 C++ 将 Unicode 输出到控制台

将 Visual C++ 控制台输出复制(不重定向)到文本文件,同时仍在控制台窗口中查看输出

如何将 .exe 从 C++ 项目复制到 C# 项目的输出目录?

如何在 Visual Studio C++ 中将西里尔文(俄语)字符输出到控制台?

如何在 Eclipse 中将执行显示输出到远程 C++ 的控制台?

将文本装饰添加到控制台输出