Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Qt控制台:将所有stdin和stdout记录到文件中_C++_Qt_Qtextstream - Fatal编程技术网

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

C++ Qt控制台:将所有stdin和stdout记录到文件中,c++,qt,qtextstream,C++,Qt,Qtextstream,我有一个Qt控制台应用程序。与用户的所有通信通过两个流进行: QTextStream in(stdin); QTextStream out(stdout); 现在我想将整个会话记录到一个文件中,但我不想在使用流的每个位置都添加日志输出 是否有一种简单的方法将两个流的数据“T”到控制台和文件 该应用程序必须在Windows上运行。我建议一个非常简单的解决方案,但建议使用c++14。 我将以这种方式包装QTextStream(输出仅作为示例): #包括 #包括 类OutTeeTextStream

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

QTextStream in(stdin);
QTextStream out(stdout);
现在我想将整个会话记录到一个文件中,但我不想在使用流的每个位置都添加日志输出

是否有一种简单的方法将两个流的数据“T”到控制台和文件


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

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

#包括
#包括
类OutTeeTextStream
{
公众:
OutTeeTextStream()
{
logfilestream=0;
stdoutstream=新的QTextStream(stdout);
setFileName(“/tmp/outlog.log”);
if(file.open(QFile::Append))
{
logfilestream=新的QTextStream(&file);
}
}
~OutTeeTextStream()
{
file.close();
删除stdoutstream;
删除日志文件流;
}

OutTeeTextStream和operatories,您可以创建从std::streambuf继承的类,其中“tee”是您的流,并将其提供给QTextStream而不是stdin/stdout…如果您搜索“c++tee streambuf”,这实际上是第一个google结果。
#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;
};