繁体   English   中英

std::cout 不会打印

[英]std::cout won't print

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

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

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

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

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

std::cout.flush();

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

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

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

要有效地禁用缓冲,您可以调用它:

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

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

stdbuf -o 0 ./yourprogram --yourargs

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM