九天猎人 发表于 3 天前

Linux --进度条小程序更新

这里使用随机数来模拟下载量,来实现一个下载进度更新的小程序
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;
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=STYLE;
      bar='>';
    }
    if(i == NUM)
      bar='\0';
}
char lable;
static int n= 0;
n++;
n %= PUM;
memset(lable,'\0',PUM);
for(i = 0; i < PUM; i++)
{
    if (i < n )
       lable=POINT;
    else
      lable=' ';
    if(i == PUM-1)
      lable='\0';
}
if(percent==100)
{
    printf("已下载量: %-6.1f mb 总下载量: %-6.1f mb[%-51s][%3d%%]\r",current,total,bar,percent);
}
else{
printf("已下载量: %-6.1f mb 总下载量: %-6.1f mb[%-51s][%3d%%][%-6s]\r",current,total,bar,percent,lable);
}
fflush(stdout);
}
代码运行效果图:
https://i-blog.csdnimg.cn/direct/e370ef81d69b4a3e8afd2ed6390d441d.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: Linux --进度条小程序更新