【问题标题】:std::cout won't printstd::cout 不会打印
【发布时间】:2013-01-29 06:39:04
【问题描述】:

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

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

【问题讨论】:

  • 啊,缓冲输出,虽然艺术是个无情又残忍的丫头。
  • C 中没有std::cout
  • 在窗口系统中,std::cout 可能无法实现,因为存在窗口并且操作系统不知道要输出到您的哪个窗口。
  • 永远不要给 cout NULL。它会停止工作。

标签: c++ debugging buffer iostream cout


【解决方案1】:

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

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

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

std::cout.flush();

【讨论】:

  • @GrijeshChauhan 从什么时候开始只向格式化的输出流发送换行符强制刷新?我认为标准对刷新没有内容感知,依赖成员 (flush()) 和操纵器 (endl) 来触发流缓冲区刷新?自从某个特定的 C++ 标准以来,情况是否如此?
  • @GrijeshChauhan 这不会刷新缓冲区(或者不应该:在某些实现中会这样做)。
  • 请发布包含 std::cout 的语句组
  • @GrijeshChauhan 然后,如果它确实刷新了您的实现,那么它会超出标准。不能保证在所有实现上都可以。如果您想要保证换行+刷新,您需要std::endl 或附加\n,然后调用将触发刷新的多个成员之一。标准不能保证仅附加带有 '\n' 的文本。
  • 仅出于完整性考虑(sftrabbit 提出的解决方案更好),但您可以致电std::cout.rdbuf()-&gt;pubsetbuf( NULL, 0 ); 关闭缓冲。或者您可以通过std::cout &lt;&lt; std::unitbuf 激活单元缓冲。
【解决方案2】:

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

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

【讨论】:

  • 更具体地说,你需要OutputDebugString。
【解决方案3】:

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

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

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

stdbuf -o 0 ./yourprogram --yourargs

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

【讨论】:

  • 这帮助我修复了在传输一定数量(随机)数据后停止打印的标准输出。 flush() 在那里没有帮助。非常感谢。
【解决方案4】:

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

【讨论】:

    猜你喜欢
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-07
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多