You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何手动刷新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.15 10:24:00