我有一个 Qt 控制台应用程序。与用户的所有通信都经过两个流:
QTextStream in(stdin);
QTextStream out(stdout);
现在我想将整个会话记录到文件中,但我不想在使用流的每个位置添加日志输出。
有没有一种简单的方法可以将两个流的数据“发送”到控制台和文件?
该应用程序必须在 Windows 上运行。
我有一个 Qt 控制台应用程序。与用户的所有通信都经过两个流:
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)。