【发布时间】:2013-02-09 04:08:58
【问题描述】:
我在学习 C++,发现了一些我看不懂的东西:
可以显式刷新输出缓冲区以强制缓冲区 书面。默认情况下,读取
cin刷新cout;cout也被刷新 当程序正常结束时。
所以刷新缓冲区(例如输出缓冲区):这是通过删除缓冲区中的所有内容来清除缓冲区,还是通过输出其中的所有内容来清除缓冲区?还是刷新缓冲区意味着完全不同的东西?
【问题讨论】:
标签: c++ input buffer output flush
我在学习 C++,发现了一些我看不懂的东西:
可以显式刷新输出缓冲区以强制缓冲区 书面。默认情况下,读取
cin刷新cout;cout也被刷新 当程序正常结束时。
所以刷新缓冲区(例如输出缓冲区):这是通过删除缓冲区中的所有内容来清除缓冲区,还是通过输出其中的所有内容来清除缓冲区?还是刷新缓冲区意味着完全不同的东西?
【问题讨论】:
标签: c++ input buffer output flush
考虑写入文件。这是一项昂贵的操作。如果在您的代码中一次写入一个字节,那么每次写入一个字节将非常昂贵。因此,提高性能的一种常用方法是将正在写入的数据存储在临时缓冲区中。只有当有大量数据时才将缓冲区写入文件。通过推迟写入,一次写入一个大块,性能得到了提升。
考虑到这一点,刷新缓冲区是将数据从缓冲区传输到文件的行为。
这是通过删除缓冲区中的所有内容来清除缓冲区,还是通过输出缓冲区中的所有内容来清除缓冲区?
后者。
【讨论】:
你已经引用了答案:
可以显式刷新输出缓冲区以强制写入缓冲区。
也就是说,您可能需要“刷新”输出以将其写入底层流(可能是一个文件,或者在列出的示例中,一个终端)。
通常,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;
【讨论】:
sleep() (POSIX) 与Sleep() (Windows) 混淆了
std::cout)限定cout,但没有为endl 这样做,这也应该需要该限定。
通过输出所有内容来清除缓冲区。
【讨论】: