这里使用随机数来模拟下载量,来实现一个下载进度更新的小程序
main.c 的代码,其中downlod这个函数使用的是函数指针,如果有多个进度条函数可以传入进行多样化的格式下载表现,还必要传入一个下载总量,每次"下载以后革新一次进度条",具体实现如下。
- #include<stdio.h>
- #include<stdlib.h>
- #include"process.h"
- #include<time.h>
- const int base=100;
- double total1 =2048.0;
- double total2 =500.0;
- double once =0.5;
- typedef void (*flush_t)(double current,double total);
- void downlod(flush_t f,double total)
- {
- double current=0.0;
- double speed=0.0;
- while(current <= total)
- {
- int n = rand() % base + 1 ;
- speed=n * once;
- current+=speed;
- if(current>total)
- {
- current=total;
- process(current,total);
- usleep(100000);
- break;
- }
- f(current,total);
- usleep(100000);
- }
- printf("\n");
- }
- int main()
- {
- srand(time(NULL));
- downlod(process,total1);
- downlod(process,total2);
- return 0;
- }
复制代码 process.c的实现与上一篇文章的方法类似,只是更改了一个下载样式 ' . ',lable使用一个数组来储存,其中点的个数由静态变量n控制,在第一个循环中当i等于NUM大小时会将末了一个字符设置为'\0',否则在打印的时间会出现“烫烫烫”等字符,这是由于字符串以'\0'作为结束标记。此次代码根据真实的应用场景,进行动态革新,由percent控制'#'的数目。末了在打印进度条时还添加了当前下载量和总的下载量,下载完成时状态栏会表现Finish,具体实现如下。
- #include"process.h"
- #include<string.h>
- #define NUM 100
- #define STYLE '='
- #define POINT '.'
- #define PUM 7
- void process(double current, double total)
- {
- char bar[NUM/2+2];
- memset(bar , '\0' , sizeof(bar));
- int percent=(int)(current / total * 100);
- int i = 0;
- for(i = 0; i <=percent; i++)
- {
- if(i % 2 == 0)
- {
- bar[i/2]=STYLE;
- bar[i/2+1]='>';
- }
- if(i == NUM)
- bar[i/2+1]='\0';
- }
- char lable[PUM];
- static int n= 0;
- n++;
- n %= PUM;
- memset(lable,'\0',PUM);
- for(i = 0; i < PUM; i++)
- {
- if (i < n )
- lable[i]=POINT;
- else
- lable[i]=' ';
- if(i == PUM-1)
- lable[i]='\0';
- }
- if(percent==100)
- {
- printf("已下载量: %-6.1f mb 总下载量: %-6.1f mb[%-51s][%3d%%][Finish]\r",current,total,bar,percent);
- }
- else{
- printf("已下载量: %-6.1f mb 总下载量: %-6.1f mb[%-51s][%3d%%][%-6s]\r",current,total,bar,percent,lable);
- }
- fflush(stdout);
- }
复制代码 代码运行效果图:
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |