c++ 使用QTextStream停止std::cout工作

y53ybaqx  于 2023-01-22  发布在  其他
关注(0)|答案(1)|浏览(189)

在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重新开始工作?

d4so4syb

d4so4syb1#

在我的计算机(Visual Studio Community Edition 2019和QT 5.9.9)上,这将编译并打印包括第7行在内的每一行。如果您希望确保缓冲区在第7行刷新,可以用途:

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

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

std::cout << std::unitbuf

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

相关问题