在Linux下用C语言实现简单的进度条

相信我们在平时使用电脑进行下载文件的同时都会看到一个进度条,提示我们文件下载的进度,所以呢我们来自己实现一个简单的进度条:
首先我们来看一个生活中的进度条:
这里写图片描述
通过观察我们选择用以下方式来实现一个简单进度条:
1.依次打印‘#’;
2.后面标注百分比;

代码如下:

#include<stdio.h>
#include<unistd.h>
int main()
{
    int i = 0;
    char bar[120];
    const char *lable = "|/-\\";
    while (i <= 100)
    {
        printf("[%-100s][%d%%][%c]\r", bar, i, lable[i % 4]);
        fflush(stdout);
        bar[i] = '#';
        i++;
        bar[i] = 0;
        usleep(100000);
    }
    printf("\n");
    return 0;
}

运行结果:
这里写图片描述
这里写图片描述
备注:
fflush:
功能:清除文件缓冲区,文件以写方式打开时将缓冲区内容写入文件。
fflush 的返回值类型是int类型。如果成功刷新,fflush返回0。指定的流没有缓冲区或者只读打开时也返回0值。返回EOF指出一个错误。
fflush(stdin)刷新标准输入缓冲区,把输入缓冲区里的东西丢弃[非标准];
fflush(stdout)刷新标准输出缓冲区,把输出缓冲区里的东西打印到标准输出设备上;
printf(“。。。。。。。。。。。”);后面加fflush(stdout);可提高打印效率。

彩色进度条
在上面进度条的基础上实现一个彩色进度条。
终端的字符颜色由转义序列控制,是文本模式下的系统显示功能,与具体语言无关。转义序列以控制字符’ESC’开头。多数转义序列超过两个字符,故通常以’ESC’和左括号’[‘开头。该起始序列称为控制序列引导符,通常由’\033[‘或’\e[‘代替。


printf("\033[0;37m%s\033[0m","hello world");   

\033 是E的asc码,而这种是一个标记对,\033 是成对存在的.可以用e代替成\033
\033[ 后面的第一个参数是关闭所有文字的效果。

第二个参数是字体以及字体背景的颜色:
30-黑色,31-红色 ,32-绿色,33-黄色,34-蓝色,35-紫色,36-墨绿,37~39-白色
字体的背景色:
40-黑色,41-红色,42-绿色,43-黄色,44-蓝色,45-紫色,46-墨绿色,47-白色

第三个参数是字体的效果:
效果分为:1-高亮,4-下划线,5-闪烁,7-背景取反,2J—-清屏
最后一个m代表后面跟着要显示的字符串
这里写图片描述
这里写图片描述

模拟实现彩色进度条:

#include<stdio.h>
#include<unistd.h>
#define RED "\e[0;31m"
#define BLUE "\e[0;34m"
#define NONE "\e[0m"
#define GREEN "\e[0;32m"
#define YELLOW "\e[0;33;1m"
#define PURPLE "\e[0;35m"
#define GR "\e[0;36m"
 main()
{
    char bar[120];
    const char* lab = "|\-/-";
    int i = 0;
    while(i<=100)
    {
    if(i%10==1)
    {
       printf(RED"[%-100s][%d][%c]\r"NONE,bar,i,lab[i%4]);
    }
    else if(i%10==2)
    {
       printf(YELLOW"[%-100s][%d][%c]\r"NONE,bar,i,lab[i%4]);
    }
    else if(i%10==3) 
    {
       printf(BLUE"[%-100s][%d][%c]\r"NONE,bar,i,lab[i%4]);
    }
    else if(i%10==4)
    {
        printf(GREEN"[%-100s][%d][%c]\r"NONE,bar,i,lab[i%4]);
    }
    else if(i%10==5)
    {
        printf(PURPLE"[%-100s][%d][%c]\r"NONE,bar,i,lab[i%4]);

    }
        else
    {
        printf(GR"[%-100s][%d][%c]\r"NONE,bar,i,lab[i%4]);
    }
    fflush(stdout);
    bar[i] = '#';
    i++;
    bar[i]=0;
    usleep(100000);
    }
    printf("\n");
    return 0;

}  

效果如下:
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

<think>好的,我现在需要回答用户关于用C语言实现动态进度条的问题。首先,我得回忆一下之前提供的引用内容,看看有没有相关的代码示例。引用2和引用3都提到了C语言进度条实现,所以这些可能是关键。 用户想要动态的进度条,也就是在终端中实时更新的效果。通常,这需要控制输出,比如使用回车符`\r`来覆盖当前行,而不是换行。这样可以让进度条在同一行不断更新。 引用2中的代码是一个简单的15行示例,它使用`printf`和`\r`来实现动态效果,同时用`fflush(stdout)`确保输出立即显示。引用3的代码更复杂一些,包含进度条的填充字符和百分比显示。这两个例子都可以作为参考。 接下来,我需要把这些示例整理成一个清晰的步骤说明。首先,动态进度条的基本原理是:使用回车符、刷新输出缓冲区、控制输出格式。然后,分步骤解释如何实现,比如初始化进度条字符串,循环更新,处理显示效果等。 还需要考虑如何添加旋转符号或百分比,这样进度条看起来更生动。引用2中的`arr`数组用来显示旋转的符号,引用3则用了不同的填充字符。这些都可以作为示例代码的一部分。 另外,要注意不同平台的可能差异,比如`usleep`在Windows和Linux下的不同。可能需要提到这一点,或者建议使用可移植的函数。 最后,生成相关问题,帮助用户进一步学习,比如性能优化、原理深入或扩展功能。这些问题应该与进度条实现相关,但又不重复已有的内容。 总结一下,回答的结构应该是先介绍原理,再分步骤讲解,然后给出代码示例,最后附上相关问题。确保代码正确,符合C语言标准,并解释关键点,如`\r`和`fflush`的作用。</think>以下是用C语言实现动态进度条的详细方法和代码示例: ### 一、动态进度条实现原理 1. **行内刷新**:使用回车符$\\r$替代换行符$\\n$实现行内刷新[^2] 2. **缓冲刷新**:通过$fflush(stdout)$强制刷新输出缓冲区[^2] 3. **动态效果**:结合进度百分比+旋转符号+进度条图形化显示[^3] ### 二、分步骤实现代码 ```c #include <stdio.h> #include <unistd.h> // 包含usleep函数 int main() { const int TOTAL = 50; // 总进度单位数 char bar[TOTAL + 1] = {0}; // 进度条数组 const char* spin = "|/-\\"; // 旋转符号 for (int i = 0; i <= TOTAL; i++) { bar[i] = '#'; // 填充进度符号 // 输出格式:[进度条] 百分比 旋转符 printf("\r[%-50s] %3d%% %c", bar, i*2, spin[i % 4]); fflush(stdout); // 强制刷新输出缓冲区 usleep(100000); // 微秒级延时(0.1秒) } printf("\nDone!\n"); return 0; } ``` ### 三、关键代码解析 1. `\r`:将光标移动到行首实现覆盖效果[^2] 2. `%-50s`:左对齐50字符宽度保证进度条长度固定 3. `usleep`:控制刷新频率(100000微秒=0.1秒) 4. `spin[i % 4]`:循环显示4种旋转符号实现动画效果[^3] ### 四、增强特性建议 1. 添加颜色控制:使用ANSI转义序列 2. 支持进度回调:封装为函数供任务调用 3. 多线程处理:分离显示逻辑与任务逻辑
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值