Linux--实现彩色进度条小程序

这里写图片描述
实现一个彩色的进度条需实现以下几点:

(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” 将颜色恢复。

猜你喜欢

转载自blog.csdn.net/qq_37934101/article/details/80334316