使用 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 行被刷新,所以这真的不是问题。
在安装了 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 行被刷新,所以这真的不是问题。