实现一个彩色的进度条需实现以下几点:
(1) 由#组成的进度条在一行上由少到多一个个增长,直到增加到已设定的值
(2) 随着进度条的增长,在该行的结尾显示变化着的进度百分比
(3) 在进度条增长的过程中,有一光圈不停转动,直到进度条完成
(4) 将进度条变为彩色的
1.实现进度条的显示
我们做的进度条是一个方括号不动 方括号里逐渐填充#的一个进度条
那么 我们就需要固定一个长度 向其中添加东西
我们就需要用到 printf(“[-100s%]”,buf);这里的100是规定长度但是100是从右向左输出 所以我们用到-100
2.进度条怎么处理进度增加?
这里 我们需要知道回车和换行的知识 回车和换行是不一样的
回车指的是回到一行的首部
换行指的是换到下一行
那么我们如果需要让进度条逐渐增加 我们就仅仅只需要回车这一个功能
在C语言里回车是 \r
简而言之:\n:切换到下一行 \r回到这行的起始位置
3.进度条如何缓慢显示?
毫无疑问 这里需要用(秒为单位)sleep/usleep(微秒为单位)函数
但是 当我们先打印再用usleep时 我们发现它并没有先打印 而是隔了一段时间后全部显示
所以 我们还需要了解缓冲区
缓冲区分为无缓冲、行缓冲、全缓冲。
无缓冲:表示的是没有缓冲,可以将信息立马显现出来,典型代表是标准错误流stderr。
行缓冲:表示的是输入输出遇到换行才执行真正的I/O操作。典型的代表是键盘的操作。
全缓冲:表示的是输入输出写满缓冲区才执行I/O操作。典型的代表是磁盘的读写。
根据冯诺依曼思想 cpu处理完放到内存中 内存之后才会输出到输出设备上 所以我们需要刷新stdout
printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中
刷缓冲区的条件如下:
(1)缓冲区填满;
(2)写入的字符中有‘\n’;
(3)调用fflush手动刷新缓冲区;
(4)调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新;
满足上面4个条件之一缓冲区就会刷新
所以我们应该用fflush函数刷新缓冲区以便让他立马显示到屏幕上
最后通过usleep()函数,控制进度条的加载速度。
#include<unistd.h>
#include<string.h>
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i=0;
char bar[102];
memset(bar,0,sizeof(bar));
const char *lable="|/-\\";
while(i<=100)
{
printf("[%-100s][%d%%][%c]\r",bar,i,lable[i%4]);
fflush(stdout);
bar[i++]='#';
usleep(10000);
}
printf("\n");
return 0;
}
彩色版本
在输出函数中写入颜色控制代码
功能 | 代码 |
---|---|
\033[0m | 关闭转义序列 |
\033[1m | 粗体或高亮 |
\033[5m | 闪烁 |
\033[30m | 黑 |
\033[31m | 红 |
\033[32m | 绿 |
\033[33m | 黄 |
\033[34m | 蓝 |
\033[35m | 洋红 |
\033[36m | 青 |
\033[37m | 白 |
格式还可以变成“\e[0;31m” 0是背景色 31为前景色
背景颜色序列:
与前景颜色对对应,前景色是30+,背景色是40+
颜色显示代码
printf("\e[0;31m""[%-100s][%d%%][%c]\r""\e[0m",bar,i,lable[i%4]);
最后要用”\e[0m” 将颜色恢复。