冲洗缓冲区意味着什么?

Moh*_*bil 87 c++ buffer input flush output

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

可以显式刷新输出缓冲区以强制写入缓冲区.默认情况下,读取cin刷新cout; cout程序正常结束时也会刷新.

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

Dav*_*nan 105

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

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

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

后者.

  • 当您使用流操作符从cin读取时,会发生读取cin.通常,您希望在读取时刷新cout,否则输入可能会出现在提示之前. (4认同)

tc.*_*tc. 20

你引用了答案:

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

也就是说,您可能需要"刷新"输出以使其被写入底层流(可能是文件,或者在列出的示例中,即终端).

通常,stdout/cout是行缓冲的:在您写入换行符或显式刷新缓冲区之前,输出不会被发送到OS.优点是类似的东西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";
Run Code Online (Sandbox Code Playgroud)

将立即输出.....(对于确切的sleep实现,请参阅此问题).在这种情况下,您需要额外的一个<< std::flush以确保显示输出.

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

std::string colour;
std::cout << "Enter your favourite colour: ";
std::cin >> colour;
Run Code Online (Sandbox Code Playgroud)

  • @Naz \n 不刷新缓冲区;在他的示例中,缓冲区仅在程序结束时刷新(缓冲区始终在 C++ 程序结束时自动刷新)。\n 可能只是用于格式化。此外, std::endl 刷新缓冲区是正确的(std::flush 也是如此,但这是不言自明的)。 (2认同)

Ale*_*ain 5

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