【问题标题】:stdout and need to flush it C++标准输出并需要刷新它 C++
【发布时间】:2011-09-07 01:30:16
【问题描述】:

我有一些 C++ 代码使用 cout 语句进行调试,出于某种原因,我无法打印所有数据,除非最后执行 std::cout.flush();

我不太明白为什么需要这个刷新操作。

有人有什么见解吗?

【问题讨论】:

  • 请不要编辑我的问题,谢谢。

标签: c++ stdout flush


【解决方案1】:

这是正确的行为。您可能使用 std::endl 添加 \n 并刷新缓冲区。 http://www.cplusplus.com/reference/ostream/endl/

如果要查看输出,则需要刷新流。

【讨论】:

    【解决方案2】:

    未自动刷新的数据最后是否缺少\n?默认情况下,在看到回车之前不会传送标准输出。

    【讨论】:

    • 如果我发送一个 endl 它也会打印,但我认为在 C++ 中这与刷新操作相同?
    • 如果你愿意的话,回车被用作“刷新点”。请记住,C 与 C++ 共享相同的底层 I/O,并且 C 缺少 endl,但是 \n 仍然可以解决问题。 std::endl 实际上可能会强制刷新;我需要检查它的实现(或听取某人的意见)以确定。
    • 这是错误的。标准输出 not 行缓冲。在涉及缓冲的情况下,iostream 的工作方式与FILE 大不相同。 std::cout 将通过对flush 的显式调用(包括由std::endl 或通过读取std::cin 触发的调用)或在由实现决定的其他未指定时间刷新。 iostream 中没有行缓冲。
    • std::endl 刷新操作,而不仅仅是换行符。 '\n' 不会刷新,std::endl 会刷新 iostream。
    • 天哪!开发MinGW版gdb的人不知道,没有人设置回车。简直太可怕了!我的代码在 GNU/Linux 上运行得非常好,但由于我在 Windows® 上运行它,所以打印结果只在 gdb 中,而不是在普通终端中。只有当我添加 \r 符号时,这才得到解决。我只是没有cmets。 @Mah,顺便说一句,据我所知,标准输出不应该在“回车”上刷新,而是在“换行”上。
    【解决方案3】:

    在 C++ 中,您可以将endl 格式化程序与cout 运算符一起使用,而不是flush

    【讨论】:

      【解决方案4】:

      std::endl 的答案只有在您想要退货时才有效。 如果您想刷新命令提示符,不确定如何执行此操作。

      【讨论】:

        【解决方案5】:

        补充其他答案:您的调试语句应该转到cerr,因为:

        • 它写入标准错误,这意味着在运行应用程序时,您可以通过重定向轻松地将“正常”程序输出与错误/调试信息分开;
        • 最重要的是,cerr默认是无缓冲的,也就是说,在每次输出操作后,它会自动刷新自己,一般来说这是理想的错误和调试输出。

        (来源:C++ 标准,§27.3.1 ¶4-5,§27.4.2.1.2 表 83)

        【讨论】:

        • 谢谢,我会记住这一点以备将来参考,我通常不在乎,因为我会删除我的 cout 声明,但这个项目一直是皇家的痛苦。我讨厌第三方代码。
        【解决方案6】:

        您是否使用std::endl 来终止您的线路。这应该是 通常的做法,直到性能问题需要其他方式,但对于某些 原因,我看到很多代码都使用'\n'

        否则,您总是可以这样做:

        std::cout.setf( std::ios_base::unitbuf );
        

        作为main 中的第一件事。这将导致在 每个<< 的结尾,这超出了您的需要,但用于诊断 输出到控制台,可能是完全可以接受的。

        【讨论】:

        • 是的,我这样做是一种习惯,但我正在集成的一些代码没有,而且对我来说“纠正”它相当大..
        • @Dixon Steel 我知道这种感觉。这就是为什么我提出第二个建议,使用unitbuf
        【解决方案7】:

        “当您将输出发送到流时,它不一定会立即打印。相反,它可能会在缓冲区中等待,直到某些未指定的事件,例如缓冲区已满,从输入读取或退出程序。详细信息可能变化。”

        http://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200109/notes/io.html

        【讨论】:

        • 那么这是否意味着输出可能是不可预测的,我在流上真的没有错误或死锁?
        猜你喜欢
        • 2018-07-20
        • 2013-11-04
        • 1970-01-01
        • 1970-01-01
        • 2011-11-28
        • 1970-01-01
        • 1970-01-01
        • 2012-09-12
        • 1970-01-01
        相关资源
        最近更新 更多