目录
使用工具的简单介绍:
\r :
fflush :
倒计时的创建:
倒计时的工作原理:
进度条的创建:
不同场景下、打印任意长度的进度条:
main .c
procbor.c
测试效果:
使用工具的简单介绍:
在创建进度条之前,首先要明白两个工具,fflush 和 \r
\r :
熟悉键盘以及经常使用键盘的小伙伴应该知道,现在的键盘上的enter 回车键 和早之前的回车键样式是不一样的,如下图所示:
而且,还有一个大家并不是非常熟悉的知识,回车键的功能其实是两个,一个是换行,一个是回车。
所谓换行就是将光标从这一行变到下一行中,且是垂直下落,除此之外光标位置不会有其他的移动。
而回车就是回到当前行的最前端最开头位置。
在Linux系统中,换行和回车是并不是像键盘上的回车键一样合在一起使用,而是分别由两个命令控制着。
\r,就是Linux中的回车,在Linux的文件文本中的作用是将光标移动到当前行的开头位置,即回车。它通常与\n(换行符)一起使用,表示换行并回到行首。
fflush :
fflush函数的作用是刷新缓冲区,将缓冲区中的数据立即写入到文件中。它可以用来确保数据被及时写入文件,而不是等到缓冲区满或程序结束时才写入。
在Linux中,通常使用fflush(stdout) 将缓冲区的数据冲刷到显示器上,让数据显现。
倒计时的创建:
倒计时的工作原理:
倒计时指的是在一个位置上的数字随着光标的不断闪烁而不断的更新减小,直到为0。
在如果要在Linux上实现倒计时,除了上述的两个工具外还需要额外了一个工具,sleep 休眠命令,休眠命令可以解决倒计时数字的停顿的问题。
在Linux实现的原理则
- 利用缓冲区实现一个简单的倒计时,使用\r返回光标位置并清除缓冲区数据,但是使用fflush将缓冲区的数据提取到了显示器文件中。
- 单单只有\r是不行的,因为\r虽然把光标的位置进行了返回(输入一个数字光标会移动到下一个位置,但是\r会在移动下一个位置后会返回回去),但是会将数字从缓冲区中删除清空,导致在显示器中显示不出来,所以需要fflush进行提取
进度条的创建:
一个进度条最基本的要求是要有进度读条,要有显示进度读条占总数据占比的百分比数字,要有旋转的表示进度正在进行中的光标图案。
在Linux中,可以使用 # = 等符号表示进度读条,而根据之前倒计时的操作,我们直到需要定义一块区域作为缓冲区,随后不断地更新和刷新缓冲区内部的数据,将其数据显示到显示屏上依次达到进度条不断地在更新进度,不断地在增长的效果。
同时,为了表示进度条不断地在增长,因此需要使用循环函数在缓冲区中不断地添加#来显示进度条的增长。
而对于百分比数据,可以利用定义好的缓冲区大小来通过计算得到,在上图中,定义的百分比大小是101,其中的1表示的是最初始的数据,也就是 \0 来表达进度是0 ,所以只要按照#的个数来计算百分比的占比是多少。
同时为了保证进度条是一个不会因为进度的增长而不断变长,而是有一个固定长度的,所以使用%-100实现距离的扩充以及往右边增长进度的效果。
而百分比的数据则需要打印除#号的个数以及加上%即可完成,注意%符号在文件中需要两个%才能在显示屏上显示出来。
最后,光标的添加,可以将光标的图案进行展开,然后利用\r的特性和#号个数的和光标的展开后的字符数进行计算,计算出每一个#的光标的图案,同时需要注意的是\符号需要两个\才能打印出来!
不同场景下、打印任意长度的进度条:
因为进度条是不会单独出现的,进度条要配合具体的场景使用,所以在此处我们建立一个文件下载进度的进度条。
main .c
拥有下载场景的进度条,进行下载文件:
下载文件的大小:filesize = 100兆b = 100 * 1024 * 1024 * 1.0
下载场景 download
当前累计下载的数据量 current = 0.0 初始
只要下载量小于文件大小就要一直下载 while (current < = filesize)
网速下载带宽 /下载速度: bandwidth = 1024 * 1024 *1.0 本来不是1.0的因为网速的下载速度是随机的但这里为了方便就不弄了 1024 *1024 表示一兆
下载的本质是当前的下载量加上下载速度给予的下载量,所以就构成了current + = bandwidth
同时我们的下载可能是在网络上进行的,会有些网络的卡顿,于是要加上sleep表示网络波动的效果
procbor.c
下载文件场景下的进度条本质上是给予任意数字打印任意长度进度条,所以这里传输的参数total表示的是文件的下载大小,而current表达的是文件的当前下载量。
代码和之前的进度条代码并未有太大的变化,唯一的变化是#的多少和数据的占比取决于当前下载量和文件大小之间的关系运算。
下载量*100 / 文件大小 得出 占比
例如 下载量是 2 文件大小是100 2/100 = 0.2 2*100/100 = 2 表示两个 #
两个#同时表示2%
测试效果: