Linux --进度条小程序更新

打印 上一主题 下一主题

主题 1720|帖子 1720|积分 5160

这里使用随机数来模拟下载量,来实现一个下载进度更新的小程序
main.c 的代码,其中downlod这个函数使用的是函数指针,如果有多个进度条函数可以传入进行多样化的格式下载表现,还必要传入一个下载总量,每次"下载以后革新一次进度条",具体实现如下。
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include"process.h"
  4. #include<time.h>
  5. const int base=100;
  6. double total1 =2048.0;
  7. double total2 =500.0;
  8. double once =0.5;
  9. typedef void (*flush_t)(double current,double total);
  10. void downlod(flush_t f,double total)
  11. {
  12.   double current=0.0;
  13.   double speed=0.0;
  14.   while(current <= total)
  15.   {
  16.   int n = rand() % base + 1 ;
  17.   speed=n * once;
  18.   current+=speed;
  19.   if(current>total)
  20.   {
  21.     current=total;
  22.     process(current,total);
  23.     usleep(100000);
  24.     break;
  25.   }
  26.   f(current,total);
  27.   usleep(100000);
  28.   }
  29.   printf("\n");
  30. }
  31. int main()
  32. {
  33.   srand(time(NULL));
  34.   downlod(process,total1);
  35.   downlod(process,total2);
  36.   return 0;
  37. }
复制代码
process.c的实现与上一篇文章的方法类似,只是更改了一个下载样式 ' . ',lable使用一个数组来储存,其中点的个数由静态变量n控制,在第一个循环中当i等于NUM大小时会将末了一个字符设置为'\0',否则在打印的时间会出现“烫烫烫”等字符,这是由于字符串以'\0'作为结束标记。此次代码根据真实的应用场景,进行动态革新,由percent控制'#'的数目。末了在打印进度条时还添加了当前下载量和总的下载量,下载完成时状态栏会表现Finish,具体实现如下。
  1. #include"process.h"
  2. #include<string.h>
  3. #define NUM 100
  4. #define STYLE '='
  5. #define POINT '.'
  6. #define PUM 7
  7. void process(double current, double total)
  8. {
  9.   char bar[NUM/2+2];
  10.   memset(bar , '\0' , sizeof(bar));
  11.   int percent=(int)(current / total * 100);
  12.   int i = 0;
  13.   for(i = 0; i <=percent; i++)
  14.   {
  15.     if(i % 2  == 0)
  16.     {
  17.       bar[i/2]=STYLE;
  18.       bar[i/2+1]='>';
  19.     }
  20.     if(i == NUM)
  21.       bar[i/2+1]='\0';
  22.   }
  23.   char lable[PUM];
  24.   static int n= 0;
  25.   n++;
  26.   n %= PUM;
  27.   memset(lable,'\0',PUM);
  28.   for(i = 0; i < PUM; i++)
  29.   {
  30.     if (i < n )
  31.        lable[i]=POINT;
  32.     else
  33.       lable[i]=' ';
  34.     if(i == PUM-1)
  35.       lable[i]='\0';
  36.   }
  37.   if(percent==100)
  38.   {
  39.     printf("已下载量: %-6.1f mb 总下载量: %-6.1f mb[%-51s][%3d%%][Finish]\r",current,total,bar,percent);
  40.   }
  41.   else{
  42.   printf("已下载量: %-6.1f mb 总下载量: %-6.1f mb[%-51s][%3d%%][%-6s]\r",current,total,bar,percent,lable);
  43.   }
  44.   fflush(stdout);
  45. }
复制代码
代码运行效果图:


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

九天猎人

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表