【问题标题】:Qt console: Log all stdin and stdout to fileQt 控制台:将所有标准输入和标准输出记录到文件中
【发布时间】:2017-12-18 11:07:53
【问题描述】:

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

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

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

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

应用程序必须在 Windows 上运行。

【问题讨论】:

  • 是的,您可以创建继承自 std::streambuf 的类,其中“tee”是您的流并将其提供给 QTextStream 而不是 stdin/stdout...@ 987654321@ 实际上是第一个谷歌结果,如果你用谷歌搜索“c++ tee streambuf”。

标签: c++ qt qtextstream


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 2012-07-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多