您的位置:首页 > 运维架构 > Linux

Linux下彩色进度条的实现

2018-03-07 10:50 288 查看

一、前言

我们在Linux在安装软件的时候,均会有一个进度条来显现安装进度,进度条的实现较为简单,而彩色进度条则是在普通进度条的基础上增加了颜色的设置,下面来详细为大家介绍一个彩色进度条的实现。

二、准备知识

2.1 缓冲区概念一个缓冲区对象是固定数量的数据的容器,其作用是一个存储器,或者分段运输区,在这里数据可被存储并在之后用于检索。一般C库函数写入文件是全缓冲方式,而写入显示器是行缓冲方式,printf、fwrite库函数会自带缓冲区,而我们只要达到了一种缓冲方式我们就可以刷新缓冲区,一般情况下我们有以下缓冲方式:
    行缓冲:一行的末尾只要有‘\n’我们即可刷新缓冲区。
    全缓冲:把缓冲区写满,立刻刷新缓冲区。
    无缓冲:系统调用无缓冲区函数。

如果我们没有遇到回车换行符,缓冲区不会立刻将数据显示出来,而是进入sleep函数中,实际上最新执行的仍然是sleep之前的程序,因为没有\n出现,所以数据先会被放在缓冲区中,所以我们需要用fflush强制刷新缓冲区。
2.2 颜色的实现颜色的实现很简单我们只需要在需要显示颜色的部分输入颜色的编号即可,但是最重要的是我们需要在最后用\033[0m关闭所有属性,不然程序运行后会在运行后的后续文字中也变为你所设置的颜色,但是如果用ls命令,你会发现颜色由恢复原来的样子,因为ls命令有内置的\033[0m代码来关闭所以属性。
控制码含义
\033[0m关闭所有属性
\033[1m设置高亮度
\033[4m下划线
\033[5m闪烁
\033[7m反显
\033[8m消隐
\033[30m– \033[37m设置前景色
\033[40m– \033[47m设置背景色
\033[nA光标上移n行
\033[nB光标下移n行
\033[nC光标右移n列
\033[nD光标左移n列
\033[y; H设置光标位置
\033[2J清屏
\033[K清除从光标到行尾的内容
\033[s保存光标位置
\033[u恢复光标位置
\033[? 25l隐藏光标
\033[? 25h显示光标
前景色的光标代码
代码含义
30黑色
31红色
32绿色
33黄色
34蓝色
35紫色
36深绿色
37白色
背景色的光标代码
代码含义
40黑色
41深红色
42绿色
43黄色
44蓝色
45紫色
46深绿色
47白色

三、彩色进度条实现准备工作

3.1 彩色进度条预览


由上图我们可以看到,该进度条由三个方括号[]组成,其中用第一个方括号存放'#'号,第二个方括号存放进度的百分数,第三个方括号存放字符串"|\\-/",用来实现动态的一个效果。
3.2 彩色进度条准备工作首先来看第一个方括号,每次递增一个'#',从0个到100,一共是101个,但是还需要在最后加上一个’\0’表示结束,所以一共有102个空间,因此需要定义一个字符数组:char bar[102] = {0};
接着来看第二个方括号,第二个方括号用来显示进度,只需要一个变量即可,因此定义:int i = 0;
最后第三个方括号,第三个方括号是为了实现动态效果,需要准备一个字符常量,const char* label = "|\\-/";
做好准备工作,我们来看一下实现过程,直接在while中输出这些即可,在输出的时候注意格式控制,增加颜色实现;同时需要在printf的最后加上\r换行,如果不加则不会刷新,最后采用fflush强制输出;最后需要加上一个延时,否则进度条太快,肉眼无法观测。

四、代码实现

#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{
int i = 0;
char bar[102];
const  char* label = "|\\-/";
memset(bar, 0, sizeof(bar));

while (i <= 100)
{
printf("\033[35m[%-100s]\033[0m[%d%%][%c]\r", bar, n, label[i % 4]);
fflush(stdout);
bar[n++] = '#';
usleep(10000);
}
printf("\n");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: