std :: cout不会打印

mah*_*ood 20 c++ debugging buffer iostream cout

有什么情况什么时候std::cout << "hello"不起作用?我有ac/c ++代码,但是std::cout不打印任何东西,甚至不是常量字符串(例如"hello").

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

Jos*_*eld 40

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

std::cout << "Hello" << std::endl;
Run Code Online (Sandbox Code Playgroud)

std::endl将输出换行符并刷新流.另外,std::flush将刚刚做齐平.也可以使用流的成员函数来完成刷新:

std::cout.flush();
Run Code Online (Sandbox Code Playgroud)

  • @GrijeshChauhan从什么时候只向格式化的输出流发送换行符强制刷新?我认为标准不是关于刷新的内容意识,依靠成员(`flush()`)和操纵器(`endl`)来跳过流缓冲区刷新?从特定的C++标准开始就是这样吗? (5认同)
  • @GrijeshChauhan然后,如果它确实刷新了你的实现,它就会超出标准.它不能保证在所有实现上.如果你想要一个有保证的换行符+ flush,你需要`std :: endl`或者附加一个`\n`然后调用一个会跳过同花顺的成员之一.只需附加一个带有''\n''的文本,标准就无法单独保证. (3认同)

小智 11

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

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


Nic*_*y77 6

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

std::setvbuf(stdout, NULL, _IONBF, 0);
Run Code Online (Sandbox Code Playgroud)

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

stdbuf -o 0 ./yourprogram --yourargs
Run Code Online (Sandbox Code Playgroud)

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


utn*_*tim 5

很可能std::cout由于缓冲而无法工作(您所写的内容最终会在缓冲区中std::cout而不是在输出中).

你可以做以下事情之一: