实现一个彩色进度条的前提是要了解linux下如何改变shell的输出颜色,shell的输出颜色改变是通过转义序列完成的。
多数转义序列以控制字符 ‘ESC’ 和左中括号 ‘[’ 开头。该起始序列称为控制序列引导符,通常由 ‘\033[’ 或 ‘\e[’ 代替
通过转义序列设置终端显示属性时,采用以下格式:\033[属性{;属性;…}m 或 \e[属性{;属性;…}m
其中:’\033[’ 或 ‘\e’ 引导转义序列;'m’表示设置属性并结束转移序列。属性值可以有多个。看下图是属性表
比如我们要设置字体及背景的颜色可以这样写:
那么这下再来写彩色进度条就容易多了
1 /*彩色进度条*/
2
3 #include <stdio.h>
4 #include <unistd.h>
5 #include <string.h>
6 #define NONE "\e[0m" //用于恢复默认的终端输出属性,否则会影响后续的输出
7 #define RED "\e[0;31m"
8 #define BLUE "\e[0;34m"
9 #define YELLOW "\e[0;33m"
10 #define PURPLE "\e[0;35m"
11
12 int main()
13 {
14 char buf[100] = { 0 };
15 size_t i = 0;
16 const char* label = "-/\\|"; //模拟转圈
17 for(; i <= 20; ++i){
18 buf[i] = '*';
19 if(i <= 5)
20 printf(RED"%s[%d%%%c]\r"NONE,buf, i*5, label[i % 4]);
21 else if(i > 5 && i <= 10)
22 printf(BLUE"%s[%d%%%c]\r"NONE,buf, i*5, label[i % 4]);
23 else if(i > 10 && i <= 15)
24 printf(YELLOW"%s[%d%%%c]\r"NONE,buf, i*5, label[i % 4]);
25 else if(i > 15 && i <= 20)
26 printf(PURPLE"%s[%d%%%c]\r"NONE,buf, i*5, label[i % 4]);
27 fflush(stdout);
28 usleep(100000);//单位是毫秒,让我们能够看到进度条的运行过程
29 //sleep(1)单位是秒
30 }
31 printf("\n");
32 return 0;
33 }
解释一些内容:\r 是回到行首,让进度条逼真的做法。
\e[0m 是恢复默认的输出属性,如果不设置就会影响下一次的输出属性。
运行看下结果: