冲洗缓冲区意味着什么?

时间:2013-02-23 16:38:29

标签: c++ input buffer output flush

我正在学习C ++,我发现了一些我无法理解的东西:

  

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

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

3 个答案:

答案 0 :(得分:95)

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

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

  

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

后者。

答案 1 :(得分:19)

你引用了答案:

  

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

也就是说,您可能需要“刷新”输出以使其被写入基础流(可能是文件,或者列出的示例,终端)。

通常,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)。在这种情况下,您需要额外的<< std::flush以确保显示输出。

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

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

答案 2 :(得分:3)

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