当前位置:   article > 正文

【Linux】 Linux 小项目—— 进度条

【Linux】 Linux 小项目—— 进度条

基础知识

1 \r && \n

我们熟悉的\n 实际上是两个操作 换行与回车
回车是将光标回到行开头

换行时将光标移到下一行
而“\r” 执行的是回车操作

我们可以看一下例子:

  1. 使用 “ \n ” 在这里插入图片描述
    来看效果:

在这里插入图片描述

  1. 不使用“ \n ”
    在这里插入图片描述

来看效果:
在这里插入图片描述
为什么会产生这样的区别???
原因就在缓冲区

2 行缓冲区

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

“\n” 可以清空缓冲区 使内容出现在显示器是上
fflush()函数也可以完成类似功能。

3 函数介绍

  1. Sleep函数
    Sleep函数可以使计算机程序(进程,任务或线程)进入休眠,使其在一段时间内处于非活动状态。
    注意在VC中Sleep中的第一个英文字符为大写的"S"
    在标准C中是sleep(S不要大写),下面使用大写的来说明,具体用什么看你用什么编译器。简单的说VC用Sleep,别的一律使用sleep。
    其中,Sleep()里面的单位,是以毫秒为单位,所以如果想让函数滞留1秒的话,应该是Sleep(1000);另外还需要引用头文件 #include <windows.h>
  2. usleep()函数
    usleep功能把进程挂起一段时间, 单位是微秒(百万分之一秒)
    注意需要引头文件 #include <unistd.h>个函数不能工作在windows 操作系统中。用在Linux的测试环境下面

进度条实现

版本 1

代码实现

progressbar.h

  1 #include <stdio.h>
  2 #include<string.h>
  3 #include<unistd.h>
  4                                                                                                                                                                               
  5 void progressbar();


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

progressbar.c

  1 #include"progressbar.h"
  2 
  3 #define style '#' 
  4 #define Length 101
  5 
  6 void progressbar(){
  7   char str[Length];
  8   memset(str,'\0',sizeof(str));
  9 
 10   int cnt = 0;
 11 
 12   while(cnt<101){
 13     printf("[%-100s][%3d%%]\r",str,cnt);
 14     fflush(stdout);
 15     str[cnt++] = style;                                                                                                                                                       
 16     usleep(20000);
 17   }
 18   printf("\n");
 19 
 20 }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

main.c

  1 #include"progressbar.h"
  2 
  3 int main(){
  4   progressbar();
  5   return 0;                                                                                                                                                                   
  6 }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

运行效果

在这里插入图片描述

版本2

显然 没有进度条会单独使用,一般都是搭配下载使用。
所以接下来我们来模拟一些下载过程:
progressbar.c

  1 #include"progressbar.h"
  2 
  3 #define style '#' 
  4 #define Length 101
  5 
  6 void progressbar(double total, double current){
  7   char str[Length];
  8   memset(str,'\0',sizeof(str));
  9 
 10   int cnt = 0;
 11   double rate =(current * 100.0) / total;
 12   int loop = (int)rate;
 13 
 14   while(cnt <= loop){
 15     str[cnt++] = style;
 16   }
 17 
 18   if(rate >=100){
 19     printf("[%-100s][%0.1lf%%]\r",str,100.0);                                                                                                                                 
 20   }
 21   else
 22     printf("[%-100s][%0.1lf%%]\r",str,rate);
 23 
 24   fflush(stdout);
 25 
 26 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

main.c

  1 #include"progressbar.h"
  2 
  3 double bandwidth = 1.0 * 1024 *1024;
  4 
  5 void download(double total){
  6 
  7   double current = 0;
  8   printf("Download Begin!\n");
  9 
 10   while(current <= total){
 11 
 12     current += bandwidth;                                                                                                                                                     
 13     progressbar(total,current);
 14     usleep(1000000);
 15   }
 16   printf("\ndownload done, filesize: %.1lf\n",total);
 17   printf("\n");
 18 }
 19 int main(){
 20 
 21   download(7.8*1024*1024);
 22 
 23 
 24   return 0;
 25 }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

看看效果:
在这里插入图片描述
这下就非常类似我们的下载过程了!

Thanks♪(・ω・)ノ谢谢阅读!!!

下一篇文章见!!!

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/213018?site
推荐阅读
相关标签
  

闽ICP备14008679号