【问题标题】:What does flushing the buffer mean?刷新缓冲区是什么意思?
【发布时间】:2013-02-09 04:08:58
【问题描述】:

我在学习 C++,发现了一些我看不懂的东西:

可以显式刷新输出缓冲区以强制缓冲区 书面。默认情况下,读取cin 刷新coutcout 也被刷新 当程序正常结束时。

所以刷新缓冲区(例如输出缓冲区):这是通过删除缓冲区中的所有内容来清除缓冲区,还是通过输出其中的所有内容来清除缓冲区?还是刷新缓冲区意味着完全不同的东西?

【问题讨论】:

    标签: c++ input buffer output flush


    【解决方案1】:

    考虑写入文件。这是一项昂贵的操作。如果在您的代码中一次写入一个字节,那么每次写入一个字节将非常昂贵。因此,提高性能的一种常用方法是将正在写入的数据存储在临时缓冲区中。只有当有大量数据时才将缓冲区写入文件。通过推迟写入,一次写入一个大块,性能得到了提升。

    考虑到这一点,刷新缓冲区是将数据从缓冲区传输到文件的行为。

    这是通过删除缓冲区中的所有内容来清除缓冲区,还是通过输出缓冲区中的所有内容来清除缓冲区?

    后者。

    【讨论】:

    • 谢谢。还有一件事。读取 cin 会刷新 cout。这个“读cin”是指用户输入内容还是提示用户输入内容?
    • 当您使用流操作符从 cin 中读取时,会发生读取 cin。通常,您希望在阅读时刷新 cout,否则输入可能会出现在提示之前。
    • @DavidHeffernan 据我所知,你永远不需要在 cin 之前刷新 cout,因为 cin 和 cout 是绑定的(Stroustrup,C++ 编程语言,[io.tie])。
    【解决方案2】:

    你已经引用了答案:

    可以显式刷新输出缓冲区以强制写入缓冲区。

    也就是说,您可能需要“刷新”输出以将其写入底层流(可能是一个文件,或者在列出的示例中,一个终端)。

    通常,stdout/cout 是行缓冲的:在您写入换行符或显式刷新缓冲区之前,输出不会发送到操作系统。优点是像std::cout << "Mouse moved (" << p.x << ", " << p.y << ")" << endl 这样的东西只导致对底层“文件”的一次写入而不是六次,这对性能来说要好得多。缺点是这样的代码:

    for (int i = 0; i < 5; i++) {
        std::cout << ".";
        sleep(1); // or something similar
    }
    
    std::cout << "\n";
    

    将立即输出.....(有关精确的sleep 实现,请参阅this question)。在这种情况下,您将需要一个额外的&lt;&lt; std::flush 以确保显示输出。

    阅读cin 刷新cout,因此您不需要显式刷新来执行此操作:

    std::string colour;
    std::cout << "Enter your favourite colour: ";
    std::cin >> colour;
    

    【讨论】:

    • 为 (int i=0; i
    • @MohamedAhmedNabil 您似乎将sleep() (POSIX) 与Sleep() (Windows) 混淆了
    • 旧答案,但仅评论较少关注内容,而更多关注示例。您使用命名空间(即std::cout)限定cout,但没有为endl 这样做,这也应该需要该限定。
    • 我喜欢你的例子。但我认为 endl 刷新缓冲区,但在您的示例中, \n 刷新缓冲区。我很困惑。
    • @Naz \n 不刷新缓冲区;在他的示例中,缓冲区仅在程序结束时刷新(缓冲区始终在 C++ 程序结束时自动刷新)。 \n 可能只是用于格式化。另外,std::endl 刷新缓冲区是对的(std::flush 也是如此,但这是不言自明的)。
    【解决方案3】:

    通过输出所有内容来清除缓冲区。

    【讨论】:

      猜你喜欢
      • 2021-11-19
      • 2010-10-13
      • 2019-01-30
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 2020-07-21
      • 1970-01-01
      • 2015-03-22
      相关资源
      最近更新 更多