实现一个彩色进度条

Linux下实现一个彩色进度条

实现思想:
1. 首先得用字符显示直观上的进度,我们用一个“#”表示1%;
2. 然后每增加1%,“#”增加一个,同样在每次打印后加上一个百分制的数,表示进度条到哪了;
3.将进度条显示为彩色的

实现过程:
1. 每增加一个“#”打印一次,我们定义一个数组,每循环一次,打印一次
char buf[120] = "#";
    for(i=1; i<=100; i++)
    {
        buf[i] = '#';
        printf("[%-100s]\r", buf);
    }

        其中,%-100s表示每次打印占100个字符,不够长度的用空格补齐,且是从左边开始打印,右边的补空格;若是%100s是从右边开始打印,左边的补空格。

        同时,’\s‘表示每次打印将光标放在同一行的开头;而‘\n’是将光标放在下一行(不一定是开头);‘\r\n’则是将光标放在下一行的开头。

2. 每打印一次buf的“#”数组,就在后面跟上百分制数,直观表示进度,所以修改代码如下:
        printf("[%-100s][%d%]\r", buf, i);
        printf(END);
        fflush(stdout);//刷新输出缓冲区
        //这里稍停0.1秒
        usleep(100000);//单位为微秒,sleep函数单位为秒

        其中,i则对应每次循环的数,恰好我们的循环变量i是从1到100,刚好表示进度。再有这里要刷新输出缓冲区,因为printf输出的情况有几种,分别是遇到\n,进程结束,遇到输入函数(scanf、getchar等),用fflush刷新缓冲区,缓冲区满。所以这里我们要刷新缓冲区以保证每次打印都能被我们看见。同时,为了防止打印太快我们看不清,我们调用usleep函数让它每打印一次停一会。

3. 将打印的内容变为彩色的
        我们通过转义序列设置终端显示属性,使用格式如下:
\033[Param{;Param;...}m            或         \e[Param{;Param;...}m
        其中,\033[或\e[为引导转义序列,Param为属性项,{ }表示可选,多个选项间用分号间隔,m表示设置属性并结束转义序列

        常见的属性项为(具体可根据:man console_codes命令查询):
显示序列:
\033[0m           关闭转义序列
\033[1m           粗体或高亮
\033[5m           闪烁
前景颜色序列:
\033[30m          黑
\033[31m          红
\033[32m          绿
\033[33m          黄
\033[34m          蓝
\033[35m          洋红
\033[36m          青
\033[37m          白
背景颜色序列:
与前景颜色对对应,前景色是30+,背景色是40+
        我们在使用的时候,为了简洁,可以将其定义成宏使用。


实现代码:
//实现一个进度条                                                                                                                                                        
#include <stdio.h>
#include <unistd.h>

#define END "\033[0m"
#define BLACK "\033[30m"
#define RED "\033[31m"
#define GREEN "\033[32m"
#define YELLOW "\033[33m"
#define BLUE "\033[34m"
#define PORPLE "\033[35m"
#define DGREEN "\033[36m"
#define WHITE "\033[37m"

int main()
{
    int i = 0;
    char buf[120] = "#";
    for(i=1; i<=100; i++)
    {   
        buf[i] = '#';
        //\r把光标定义在同一行的开头位置
        int c = i%8;
        switch(c)
        {   
            case 0:
                printf(BLACK);
                break;
            case 1:
                printf(RED);
                break;
            case 2:
                printf(GREEN);
                break;
            case 3:
                printf(YELLOW);
                break;
            case 4:
                printf(BLUE);
                break;
            case 5:
                printf(DGREEN);
                break;
            case 6:
                printf(PORPLE);
                break;
            case 7:
                printf(WHITE);
                break;

        }
        //这里%-100s占位100个字符,不够用空格布满
        //不加-就从左补空格,右边打印;加-从右补空格,左边打字符
        printf("[%-100s][%d%]\r", buf, i);
        printf(END);
        fflush(stdout);
        //这里稍停0.1秒
        usleep(100000);//单位为微秒,sleep函数单位为秒
    }
    printf("\n");
}                         

运行结果:

猜你喜欢

转载自blog.csdn.net/Lycorisradiata__/article/details/80346166
今日推荐