使用 QTextStream 停止 std::cout 工作

Using QTextStream stops std::cout working

在安装了 Qt VS Tools 扩展的 Visual Studio 2019 中使用 Qt (v5.15.0)。简单的控制台应用程序。下面是问题的简单演示:

#include <iostream>
#include <QDebug>

void main()
{
    std::cout << "cout: Line 1\n";
    qDebug() << "qDebug: Line 2";
    std::cout << "cout: Line 3\n";
    QTextStream qts{stdout};
    qts << "QTextStream: Line 4\n";
    qts << "QTextStream: Line 5\n";
    qts.flush();
    qDebug() << "qDebug: Line 6";
    std::cout << "cout: Line 7\n";       // Not printed!
    qDebug() << "qDebug: Line 8";
}

除了 Line 7 之外的所有内容都已打印。注释掉四行QTextStream,再次打印Line 7

这似乎与 QTextStream 对象“捕获”标准输出有关。如何让对象释放 stdout 以便 std::cout 再次开始工作?

在我的电脑上(visual studio 社区版 2019 和 QT 5.9.9)这会编译并打印包括第 7 行在内的每一行。 如果你想确保缓冲区在第 7 行被刷新,你可以使用 :

std::cout << "cout: Line 7\n" << std::endl;

但是您必须在每一行都使用它以确保被刷新。 或者,如果您希望每次调用 std::cout 时都刷新缓冲区,您可以使用 unitbuf :

std::cout << std::unitbuf

设置 unitbuf 标志后,每次插入操作后都会刷新关联的缓冲区。 在您的系统上,这 4 QTextStream 行具有默认情况下不刷新第 7 行的副作用。在我的系统上,这些行没有这种副作用。因为从一开始就无法保证第 7 行被刷新,所以这真的不是问题。