[其它应用] 基于C语言的进度条

[复制链接]
3193|3
 楼主| flycamelaaa 发表于 2024-12-18 16:43 | 显示全部楼层 |阅读模式
进度条的应用在软件中无处不在,拷贝一个文件需要一个进度条,加载一个文件也需要一个进度条,来标志完成与否。
    那么 ,一个进度条有哪些元素呢:
  • 一个不断向右生长的容器(直观的看出当前的进度)
  • 一个数据化反映进度的百分比。
  • 一个标志(这个标志反映这个进度条是否在工作,还是卡死

    首先我们需要将[ ]固定在左右两边,中间预留下空间,然后用“=”进行填充。这里printf("[%-101s]\r",str);    格式化输出,‘-’表示左对齐,100表示固定列宽,然后‘\r’ 表示回车,即每次打印完使光标回到最开始位置。
    再明确一下,‘\n’和‘\r’这两个概念:‘\n’表示换行,换到当前行的下一行,即光标指向下一行最开始的位置;'\r'指回车,即光标回到最开始位置。
    如果不加睡眠时间,结果一下就全打印出来了,但我们想让它稍微慢一点,毕竟是进度条嘛,而Linux系统下默认sleep时间单位为秒(s),这样的话又觉得间隔时间太长了,于是就有了usleep,它是以微妙计的。
    C语言的printf是行缓冲输出,什么意思呢?就是说不满一行不输出,就是靠\n输出的,没有\n只好强制把缓冲中的数据输出出所以这就 要用到函数fflush()。

小夏天的大西瓜 发表于 2024-12-22 17:52 | 显示全部楼层
进度条的应用非常实用
OKAKAKO 发表于 2024-12-22 19:55 | 显示全部楼层
基于C语言的进度条非常实用方便
又见春光 发表于 2025-7-27 18:27 | 显示全部楼层
以下是基于 C 语言的控制台进度条实现:#include <stdio.h>
#include <unistd.h>

void progress_bar(int total, int current) {
    float ratio = (float)current / total;
    int bar_width = 50;
    int pos = bar_width * ratio;

    printf("\r[");
    for (int i = 0; i < bar_width; ++i) {
        if (i < pos) printf("=");
        else if (i == pos) printf(">");
        else printf(" ");
    }
    printf("] %.1f%%", ratio * 100);
    fflush(stdout);
}

int main() {
    for (int i = 0; i <= 100; i++) {
        progress_bar(100, i);
        usleep(50000);
    }
    printf("\n");
    return 0;
}

使用\r实现原地刷新
通过fflush强制输出缓冲区
可自定义进度条长度和样式
支持显示百分比

您需要登录后才可以回帖 登录 | 注册

本版积分规则

837

主题

4432

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部