Linux下彩色进度条的实现

来源:互联网 发布:资料整理软件 编辑:程序博客网 时间:2024/05/21 19:36

在Linux下安装软件的过程中会出现一个进度条,它通过动态增加一些符号来表示安装进度。今天我们就来模拟实现一下一个进度条。

在实现进度条之前,首先需要了解一些概念。
一.缓冲区
缓冲区分为三种:无缓冲,行缓冲和全缓冲。
无缓冲:指没有缓冲,立即显示信息。
行缓冲:输入输出遇到换行符才进行IO操作。
全缓冲:输入输出写满缓冲区才进行IO操作。

我们在实现一个进度条的时候,如果每次输出符号的时候不刷新缓冲区,就不会立即输出符号,而是进入sleep函数,这样的效果就不好了。所以在每次输出完的时候,都需要用fflush(stdout)刷新缓冲区,以便执行下一次的输出。

二. “\r”和”\n”的区别
\r表示回车,表示回到这行的开始位置,\n表示换行,表示换到下一行的起始位置。我们在实现进度条的时候,希望进度条在一行中显示出来,而不是在多行显示出来,所以我们在这里需要用的是\r。

三.彩色的实现
终端的字符颜色的控制由转义字符实现。通过转义序列显示终端的颜色通常以“\033[”开头,以m来表示转义序列结束。但最重要的是我们在输出完之后要用“\033[0m”来关闭所有属性,否则之后的输出也会变成所设置的颜色。下面只列出本次代码所用到的转义属性。

\033[0m ——>关闭所有属性
\033[34m ——>设置前景色为蓝色(30-37为前景色)

四.具体实现方法
这里我们用“#”来作为进度条加载的符号,一般来说加载的过程都是从0%到100%,所以我们需要有101个空间来存放0-100个“#”,再加上末尾的\0结束标志,总共是102个空间,我们定义一个字符数组bar[102]来存放我们的标记。我们还可以再末尾用一串旋转看起来动态旋转的字符串“|-/”来让这个过程更具有动感。当然了,我们还需要一个时间间隔来控制每次输出的时间。sleep的单位是s,usleep的单位是微秒(百万分之一秒),为了更快的实现,这里我们使用usleep(100000),表示每0.1S输出一个字符。

下面附上代码

#include <stdio.h>#include <unistd.h>#include <string.h>int main(){    int n = 0;    char bar[102];    const char* label="|\\-/";    memset(bar,0,sizeof(bar));    while(n <= 100)    {        printf("\033[34m[%-100s]\033[0m[%d%%][%c]\r",bar,n,label[n%4]);        fflush(stdout);        bar[n++]='#';        usleep(100000);    }    printf("\n");    return 0;}
原创粉丝点击