如何手动刷新C++输出缓冲区?求需调用flush操纵符的场景示例
首先你之前的示例中能看到输出,不是因为运行时自动刷新了缓冲区,而是main函数执行结束、程序退出前,系统会自动刷新所有标准IO流的缓冲区,字符才被打印到屏幕。
默认情况下std::cout是行缓冲,仅在缓冲区满、输出换行符\n、程序正常退出、要从关联的std::cin读数据这几种场景下会自动刷新,其他场景都需要手动调用flush操纵符刷新缓冲区。
未使用flush、缓冲区不自动刷新的示例
#include <iostream> #include <unistd.h> // Windows平台可替换为#include <windows.h>,sleep(3)替换为Sleep(3000) int main() { std::cout << "请等待3秒..."; sleep(3); // 程序暂停3秒 std::cout << "执行结束" << std::endl; return 0; }
运行效果
程序启动后前3秒屏幕没有任何输出,直到3秒结束后,请等待3秒...和执行结束会同时显示在屏幕上,就是因为第一句输出的内容一直停留在缓冲区,没有被刷新到终端。
添加flush后的对比示例
#include <iostream> #include <unistd.h> int main() { std::cout << "请等待3秒..." << std::flush; sleep(3); std::cout << "执行结束" << std::endl; return 0; }
运行效果
程序启动后立刻就会显示请等待3秒...,等待3秒后再输出执行结束,和代码的执行顺序完全一致。
常见使用场景:实时更新进度条
做进度展示类需求时必须用到flush,否则进度不会实时更新:
#include <iostream> #include <unistd.h> int main() { for (int i = 0; i <= 100; ++i) { // \r是回车符,会回到行首覆盖原有内容,实现单行动态更新 std::cout << "\r进度:" << i << "%" << std::flush; sleep(1); } std::cout << std::endl; return 0; }
如果去掉std::flush,进度会一直卡在0%,直到循环结束才直接跳到100%。
内容的提问来源于stack exchange,提问作者Abhishek Mane
相关产品推荐
相关产品推荐

