linux下实现一个彩色进度条
一、简介
我们在Linux下安装文件都会有一个进度条来提示我们安装的进度,它里面会动态增长的一个图像表示进度,同时还有百分数表示安装百分比等等信息。
实现一个进度条我们首先需要知道如下的知识我们才能完全的写出这个小程序。
二、缓冲区
一般C库函数写入文件是全缓冲方式,而写入显示器是行缓冲方式,printf、fwrite库函数会自带缓冲区,而我们只要达到了一种缓冲方式我们就可以刷新缓冲区,一般情况下我们有以下缓冲方式:
- 行缓冲:一行的末尾只要有‘\n’我们即可刷新缓冲区。
- 全缓冲:把缓冲区写满,立刻刷新缓冲区。
- 无缓冲:系统调用无缓冲区函数。
如果我们没有遇到回车换行符,缓冲区不会立刻将数据显示出来,而是进入sleep函数中,实际上最新执行的仍然是sleep之前的程序,因为没有\n出现,所以数据先会被放在缓冲区中,所以我们需要用fflush强制刷新缓冲区。
三、颜色的实现
颜色的实现很简单我们只需要在需要显示颜色的部分输入颜色的编号即可,但是最重要的是我们需要在最后用\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 | 显示光标 |
前景色的数字代码
背景色的数字代码
代码 | 含义 |
---|---|
40 | 黑色 |
41 | 深红色 |
42 | 绿色 |
43 | 黄色 |
44 | 蓝色 |
45 | 紫色 |
46 | 深绿色 |
47 | 白色 |
四、实现方法
用一个区间存放#号图像,由于我们用数组存放’#’号,从0到100一共有101个,但是还需要在最后加上一个’\0’表示结束,所以一共有102个空间,同时如果我们要实现一个旋转的圈圈所以包含了“|/-\”四个字符,所以还需要一个数组存放这些字符。
我们用一个while()里面输出这些信息即可完成进度条的实现,但是需要注意的是,我们需要的是行缓冲模式,所以我们在printf的最后加上\r表达换行,如果不加上这个则不会刷新,每次都输出一行,最后我们用fflush强制输出缓冲区的内容即可达到目的。
由于在Linux下usleep是按照毫秒计算的,这点和windows下不一样,所以我们定下了10000的数值。
三、代码实现
#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[35m[%-100s]\033[0m[%d%%][%c]\r", bar, n, label[n % 4]);
fflush(stdout);
bar[n++] = '#';
usleep(10000);
}
printf("\n");
return 0;
}