Linux 中实现进度条

Linux 中实现进度条

在这里插入图片描述


每博一文案

虽然很累,但当我们沉住气时,会发现所有的经历都是成长中的印记,
经历过大浪淘沙的洗礼后。人生会多一份坚强和淡然。
世间从没有净土,但我们可以为自己造一方乐园。有时候,生活不会立即
给我们答案,我们要拿出耐心等待,即便向空谷喊话,也要等一会儿才能听见
绵长的回音。有人说,那些让你遍体鳞伤的地方,终会长成你最坚强之处。
无论这是一路雨雪,泥泞,还是鲜花,掌声,都是独一无二的,都构成了精彩的人生
愿你在最孤独的时候,也能一个人勇敢的赶路,带着微笑,接住生活的每一个挑战。
                                            ————————————    一禅心灵庙语


进度条的实现

在这里插入图片描述


对于实现进度条 我们需要有一点的技术延伸,主要是 缓冲区,回车的的概念换行的概念

缓冲区

缓冲区又称为 缓存 ,它是内存空间上的一部分。

也就是说,在内存空间上预留了一定的存储空间,这些存储空间用来缓存输入或输出 的数据,这部分预留空间就叫做缓冲区 ,缓冲区根据区根据其对应的是输入设备还是输出设备,分为了输入缓冲区 ,和输出缓冲区

比如我们从磁盘里取信息,我们需要把读出的数据放在缓冲区中,缓冲区释放信息,让计算机读取到信息, 但是我们输入存放到缓冲区 的数据并不会,立刻释放出来,让计算机读取到,而是达到一定条件好,缓冲区 才会释放该信息, 刷新缓冲区的方式基本上有如下几种:

  1. 无缓冲区(立刻释放信息,被计算机读取)

  2. 行缓冲区 (遇到 \n 就会刷新释放缓冲区)

  3. 全缓冲区(缓冲区满了的时候,才会刷新缓冲区,file文件刷新 )

  4. 程序退出,自动刷新

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;    
} 

在这里插入图片描述

始终在本行的 最开头 显示打印结果


进度条的具体的实现

在这里插入图片描述

  1. 首先 进度条 上需要有 进度的图示动态变化
  2. 需要有进度的百分率显示
  3. 需要有判断该进度是否卡住了的,表示进度条的 正在运行 的图示,就像下载的时候,鼠标上的 转圈

创建一个字符数组用于存放显示的字符 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;    
}  

在这里插入图片描述


效果

在这里插入图片描述


最后:

限于自身水平,其中存在的错误,希望大家给予指教,韩信点兵 —— 多多益善,谢谢大家,后会有期,江湖再见 !

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值