在Visual Studio 2019中使用Qt(v5.15.0),安装了Qt VS Tools
扩展,简单的控制台应用,下面是问题的简单演示:
#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
重新开始工作?
1条答案
按热度按时间d4so4syb1#
在我的计算机(Visual Studio Community Edition 2019和QT 5.9.9)上,这将编译并打印包括第7行在内的每一行。如果您希望确保缓冲区在第7行刷新,可以用途:
但是你必须在每一行都使用它来确保缓冲区被刷新,或者,如果你想在每次调用
std::cout
时刷新缓冲区,你可以使用unitbuf
:当unitbuf标志被设置时,相关的缓冲区在每次插入操作后都会被刷新。在您的系统上,这4
QTextStream
行有一个副作用,即默认情况下不会刷新第7行。在我的系统上,这些行没有这个副作用。因为第7行从来没有被保证会被刷新,所以这真的不是一个问题。