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

问题描述 投票:2回答:1

我有一个Qt控制台应用程序。与用户的所有通信都经过两个流:

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

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

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

该应用必须在Windows上运行。

c++ qt qtextstream
1个回答
2
投票

我建议一个非常简单的解决方案,但建议使用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)。

© www.soinside.com 2019 - 2024. All rights reserved.