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是从右边开始打印,左边的补空格。
同时,’\r‘表示每次打印将光标放在同一行的开头;而‘\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");
}
运行结果: