一、前言
我们在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;
}
本文详细介绍如何在Linux环境下实现一个带有颜色变化的进度条。通过使用特定的控制码来改变输出的颜色,并结合简单的C语言程序实现进度条的动态更新。
763

被折叠的 条评论
为什么被折叠?



