這里使用隨機數來模擬下載量,來實現一個下載進度更新的小程序
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 7void 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);
}
代碼運行效果圖: