std :: cout不会打印

时间:2013-02-13 16:31:41

标签: c++ debugging buffer iostream cout

std::cout << "hello"不起作用时是否存在任何情况?我有一个c / c ++代码,但std::cout不打印任何内容,甚至不是常量字符串(例如“hello”)。

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

4 个答案:

答案 0 :(得分:37)

确保刷新流。这是必需的,因为输出流是缓冲的,你不能保证刷新缓冲区的时间,除非你自己手动冲洗它。

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

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

std::cout.flush();

答案 1 :(得分:5)

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未缓冲,但它使用不同的流(即如果您对“在控制台上看到消息”感兴趣,第二种解决方案可能对您不起作用)。

答案 2 :(得分:1)

要有效禁用缓冲,您可以调用此方法:

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

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

stdbuf -o 0 ./yourprogram --yourargs

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

答案 3 :(得分:0)

std :: cout在GUI应用程序上不起作用!

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