在实现彩色彩色进度条的过程中,我们先来了解一下相关的知识,这样才能帮助我们更好的实现进度条。
一、相关背景
说起进度条,其实大家会常常见到,对没错,就是我们下载的时候显示百分比的东西,而我们在windows下看到的进度条都是经过精心设计过后得到的。同样的,在linux环境下我们也是需要这种东西的,但是在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 | 显示光 显示光标 |
前背景色的代码
代码 | 含义 |
---|---|
30 | 黑色 |
31 | 红色 |
32 | 绿色 |
33 | 黄色 |
34 | 蓝色 |
35 | 紫色 |
36 | 深绿色 |
37 | 白色 |
背景色的代码
代码 | 含义 |
---|---|
40 | 黑色 |
41 | 深红色 |
42 | 绿色 |
43 | 黄色 |
44 | 蓝色 |
45 | 紫色 |
46 | 深绿色 |
47 | 白色 |
四、\r和\n的区别
\r表示的是回车,是光标回到最开始的位置,而\n表示的是换行,换到下一行,光标回到下一行最开始的位置,在实现进度条的过程中,需要的是\r。
五、代码的实现
用一区间存放#号图像,由于我们用数组存放’#’号,从0到100一共有101个,但是还需要在最后加上一个’\0’表示结束,所以一共有102个空间,同时如果我们要实现一个旋转的圈圈所以包含了“|/-\”四个字符,所以还需要一个数组存放这些字符。
我们用一个while()里面输出这些信息即可完成进度条的实现,但是需要注意的是,我们需要的是行缓冲模式,所以我们在printf的最后加上\r表达换行,如果不加上这个则不会刷新,每次都输出一行,最后我们用fflush强制输出缓冲区的内容即可达到目的。
由于在Linux下usleep是按照毫秒计算的,这点和windows下不一样,所以我们定下了10000的数值。
函数名: usleep
头文件: #include
功 能: usleep功能把进程挂起一段时间, 单位是微秒(百万分之一秒);
语 法: void usleep(int micro_seconds);
返回值: 无
内容说明:本函数可暂时使程序停止执行。参数 micro_seconds 为要暂停的微秒数(us)。
注 意:
这个函数不能工作在windows 操作系统中。用在Linux的测试环境下面。
参 见:usleep() 与sleep()类似,用于延迟挂起进程。进程被挂起放到reday queue。
是一般情况下,延迟时间数量级是秒的时候,尽可能使用sleep()函数。
如果延迟时间为几十毫秒(1ms = 1000us),或者更小,尽可能使用usleep()函数。这样才能最佳的利用CPU时间
时钟换算:
微秒,时间单位,符号us(英语:microsecond ).
1微秒等于百万分之一秒(10的负6 次方秒)
0.000 001 微秒 = 1皮秒
0.001 微秒 = 1纳秒
1,000 微秒 = 1毫秒
1,000,000 微秒 = 1秒
1s = 1000ms
1ms = 1000μs
1μs = 1000ns
1ns = 1000ps
1秒(s) = 1000 毫秒(ms) = 1,000,000 微秒(μs) = 1,000,000,000 纳秒(ns) = 1,000,000,000,000 皮秒(ps)
memset()函数
原型是extern void *memset(void *buffer, int c, int count) ; buffer:为指针或是数组,c:是赋给buffer的值,count:是buffer的长度.
这个函数在socket中多用于清空数组.如:原型是memset(buffer, 0, sizeof(buffer))Memset 用来对一段内存空间全部设置为某个字符,一般用在对定义的字符串进行初始化为‘ ’或‘/0’;
例:char a[100];memset(a, '/0', sizeof(a));memset可以方便的清空一个结构类型的变量或数组。
六、代码实现过程