Linux 中实现进度条
每博一文案
虽然很累,但当我们沉住气时,会发现所有的经历都是成长中的印记,
经历过大浪淘沙的洗礼后。人生会多一份坚强和淡然。
世间从没有净土,但我们可以为自己造一方乐园。有时候,生活不会立即
给我们答案,我们要拿出耐心等待,即便向空谷喊话,也要等一会儿才能听见
绵长的回音。有人说,那些让你遍体鳞伤的地方,终会长成你最坚强之处。
无论这是一路雨雪,泥泞,还是鲜花,掌声,都是独一无二的,都构成了精彩的人生
愿你在最孤独的时候,也能一个人勇敢的赶路,带着微笑,接住生活的每一个挑战。
———————————— 一禅心灵庙语
进度条的实现
- 实现语言:C语言
- 编译环境 —— Linux 中的 gcc ,关于该工具的介绍,大家可以移步到 🔜🔜🔜 Linux编译器-gcc的使用_ChinaRainbowSea的博客-CSDN博客
- 编译工具 —— Linux 中的 vim ,关于该工具的介绍,大家可以移步到 🔜🔜🔜 你一定可以看懂的:Linux编辑器-vim的使用_ChinaRainbowSea的博客-CSDN博客
- 实现效果如下:
对于实现进度条 我们需要有一点的技术延伸,主要是 缓冲区,回车的的概念,换行的概念
缓冲区
缓冲区又称为 缓存 ,它是内存空间上的一部分。
也就是说,在内存空间上预留了一定的存储空间,这些存储空间用来缓存输入或输出 的数据,这部分预留空间就叫做缓冲区 ,缓冲区根据区根据其对应的是输入设备还是输出设备,分为了输入缓冲区 ,和输出缓冲区
比如我们从磁盘里取信息,我们需要把读出的数据放在缓冲区中,缓冲区释放信息,让计算机读取到信息, 但是我们输入存放到缓冲区 的数据并不会,立刻释放出来,让计算机读取到,而是达到一定条件好,缓冲区 才会释放该信息, 刷新缓冲区的方式基本上有如下几种:
-
无缓冲区(立刻释放信息,被计算机读取)
-
行缓冲区 (遇到 \n 就会刷新释放缓冲区)
-
全缓冲区(缓冲区满了的时候,才会刷新缓冲区,file文件刷新 )
-
程序退出,自动刷新
在 C语言 中我们可以是用 fflush(stdout) 提前刷新缓冲区,到显示器中
大家观察如下代码以及效果:
#include<stdio.h>
#include<string.h>
int main()
{
printf("hello world\n"); // 注意这里是带上了斜杆 \n 的
sleep(3); // 停顿三秒
return 0;
}
这里是带上了,\n 的结果上是先把字符**”hello world"** 打印显示在了屏幕上,停顿了三秒才结束程序的
我们再看看我们把 \n 去了,结果又是如何
#include<stdio.h>
#include<string.h>
int main()
{
printf("hello world"); // 注意这里是没有带上了斜杆 \n 的
sleep(3); // 停顿三秒
return 0;
}
结果上:是 先停顿了 3 秒,再把结果打印出来,并结束程序 ,为什么一个 ”\n" 的影响如此之大
原因是: 因为缓冲区的存在,以行缓冲区 \n 会刷新缓冲区,而没有了 \n 自然无法,做到刷新缓冲区了,计算机也就没有读取到信息,也就没有把结果显示在上面了,而是等到程序运行到结束,会自动刷新缓冲区,从而让计算机读取到数据,打印显示数据信息 ”hello world" 导致的结果自然就是 先停顿 3 秒 ,再程序结束时,打印显示,当然我们,可以使用上 **函数 fflush(stdout) ** 来,提前刷新缓冲区,就可以实现没有 \n 也能实现,先打印,再停顿 3 秒 ,结束程序 ,具体实现如下:
#include<stdio.h>
#include<string.h>
int main()
{
printf("hello world"); // 注意这里是没有带上了斜杆 \n 的
fflush(stdout); // 刷新策略
sleep(3); // 停顿三秒
return 0;
}
回车键(\n\r) 和 换行 (\n)
\r 作用: 将光标移动到本行的 最开头 位置,不换行的
\n 作用: 在当前位置换行,但是不移动光标位置的,图示如下:
回车键(\n\r) : 先**\n** 换行后,再**\r** 将光标移动到本行的 最开头位置
大家可以观察如下代码:
#include<stdio.h>
#include<string.h>
int main()
{
int n = 0;
while(n < 10)
{
printf("%-1d\r",n); fflush(stdout); // 刷新策略,刷新缓冲区
sleep(1); // 停顿一秒
n++;
}
printf("\n");
return 0;
}
始终在本行的 最开头 显示打印结果
进度条的具体的实现
- 首先 进度条 上需要有 进度的图示动态变化
- 需要有进度的百分率显示
- 需要有判断该进度是否卡住了的,表示进度条的 正在运行 的图示,就像下载的时候,鼠标上的 转圈
创建一个字符数组用于存放显示的字符 char bar[101] ,需要 101个因为其中包含了一个 \n
创建一个进度条正在走的标志 鼠标上的转圈 ,char* varies = “±\\=/|” 因为 \ 需要转义所以需要双斜杆表示一个斜杆符号,
printf(“[%-100s][%-3d%%][%c]\r”,bar,i,varies[i%5]) 的理解:
[%-100s] :打印字符串,向左对齐并预留 100 个字符位置
[%-3d%%] : 打印百分率,向左对齐并预留 3 个字符位置,打印 百分号**%** ,特殊字符需要使用双百分号表示一个百分号
[%c] : 打印字符,一个进度条正在走的标志 鼠标上的转圈,i%5 :表示作用是让取值是在 [0 ~ 6]的范围变化
#include<stdio.h>
#include<string.h>
#include<unistd.h>
int main()
{
int i = 0;
char bar[101];
memset(bar,'\0',sizeof(bar)); // 初始化数组中的所有元素
char* varies = "+-\\=/|"; // 进度条的变化
while(i <= 100)
{
printf("[%-100s][%-3d%%][%c]\r",bar,i,varies[i%6]);
fflush(stdout); // 刷新缓冲区
bar[i++] = '#'; // 元素赋值
usleep(2000); // 单位毫秒,停顿 2000 毫秒
}
printf("\n");
return 0;
}
效果
最后:
限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵 —— 多多益善,谢谢大家,后会有期,江湖再见 !