std::cout 不会打印

问题描述 投票:0回答:4

是否有什么情况

std::cout << "hello"
不起作用?我有一个 C++ 程序,其中
std::cout
似乎没有打印任何内容,甚至没有打印常量字符串(例如“hello”)。

有什么方法可以检查

cout
是否能够/无法打开流?有一些成员函数,比如
good()
bad()
,...,但我不知道哪一个适合我。

c++ debugging buffer iostream cout
4个回答
62
投票

确保冲洗溪流。这是必需的,因为输出流是缓冲的,除非您自己手动刷新缓冲区,否则您无法保证何时刷新缓冲区。

std::cout << "Hello" << std::endl;

std::endl
将输出换行符并刷新流。或者,
std::flush
just进行冲洗。刷新也可以使用流的成员函数来完成:

std::cout.flush();

16
投票

std::cout 不适用于 GUI 应用程序!

特定于 MS Visual Studio: 当您需要控制台应用程序并使用 MS Visual Studio 时,请将项目属性“链接器 -> 系统 -> 子系统”设置为控制台。在 Visual Studio 中创建新的 Win32 项目(对于本机 C++ 应用程序)后,此设置默认为“Windows”,这会阻止 std::cout 将任何输出放入控制台。


10
投票

要有效禁用缓冲,您可以这样调用:

std::setvbuf(stdout, NULL, _IONBF, 0);

或者,您可以调用程序并在命令行中禁用输出缓冲:

stdbuf -o 0 ./yourprogram --yourargs

请记住,出于性能原因,通常不会这样做。


9
投票

由于缓冲,

std::cout
很可能无法工作(您正在编写的内容最终出现在
std::cout
的缓冲区中,而不是在输出中)。

您可以执行以下操作之一:

  • 冲洗

    std::cout
    明确:

    std::cout << "test" << std::flush; // std::flush is in <iostream>
    

    std::cout << "test";
    std::cout.flush(); // explicitly flush here
    

    std::cout << "test" << std::endl; // endl sends newline char(s) and then flushes
    
  • 请使用

    std::cerr
    代替。
    std::cerr
    没有缓冲,但它使用不同的流(即,如果您对“在控制台上查看消息”感兴趣,则第二个解决方案可能不适合您)。

© www.soinside.com 2019 - 2024. All rights reserved.