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"); }
运行结果: