• 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏吧

Qt控制台:将所有stdin和stdout记录到文件

c/c++ 来源:Thomas Klier 5次浏览

我有一个Qt控制台应用程序。与用户的所有通信越过两个流:Qt控制台:将所有stdin和stdout记录到文件

QTextStream in(stdin); 
QTextStream out(stdout); 

现在我想整个会话记录到文件中,但我不希望在其中流使用的每个位置添加一个日志输出。

有没有一种简单的方法可以将两个数据流的数据“发球”到控制台和文件?

该应用必须在Windows上运行。


===========解决方案如下:

我建议一个非常简单的解决方案,但推荐使用C++ 14。 我将包裹QTextStream这种方式(输出仅作为示例):

#include <QTextStream> 
#include <QFile> 

class OutTeeTextStream 
{ 
public: 
    OutTeeTextStream() 
    { 
     logfilestream = 0; 
     stdoutstream = new QTextStream(stdout); 
     file.setFileName("/tmp/outlog.log"); 
     if(file.open(QFile::Append)) 
     { 
      logfilestream = new QTextStream(&file); 
     } 
    } 
    ~OutTeeTextStream() 
    { 
     file.close(); 
     delete stdoutstream; 
     delete logfilestream; 
    } 
    OutTeeTextStream &operator<<(auto data) 
    { 
     (*stdoutstream) << data; 
     if(logfilestream != 0) 
     { 
      (*logfilestream) << data; 
     } 
     return (*this); 
    } 
private: 
    QTextStream * stdoutstream; 
    QTextStream * logfilestream; 
    QFile file; 
}; 

正如你可以看到,包装器保持两个QTextStream实例,并提供一个流插入操作,这基本上广播数据到每个。

不使用C++ 14(例如C++ 11)会导致在参数声明中使用’auto’的抱怨。在这种情况下,必须声明/定义每个插入(和提取)运算符的过载(QTextStream中大约有十五分之十七)。

重构将包括用OutTeeTextStream()替换每个QTextStream(stdout)。


版权声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系管理员进行删除。
喜欢 (0)