Qt控制台:将所有stdin和stdout记录到文件
问题描述:
我有一个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)。
是的,你可以创建从std :: streambuf继承的类,它将“tee”作为你的流并提供给QTextStream而不是** stdin/stdout ** ... [一个简单的howto](http:///wordaligned.org/articles/cpp-streambufs)实际上是第一个谷歌的结果,如果你谷歌的“C + + T恤streambuf”。 – user1810087