界面呢非常简洁,代码也非常简单,非常适合有用来练手或者消遣。
以下就是进度条的样子咯,感兴趣的朋友可以自己去“美化”一下hh
ProgressBar.c文件
用来定义ProcBar函数,该函数就是实现进度条的主核心代码,用“#”表示进度,利用之前学过的缓冲区知识,使用\r回车符来不断覆盖之前的“进度”。
#include"ProgressBar.h" #define MAX_len 101 #define Style '#' const char* lab="|/-\\";//旋转光标 void ProcBar(double tol,double cur){//tol表示要下载数据的总字节大小,cur表示当前已经下载的字节数 int i=0; char a[MAX_len]={0}; memset(a,'\0',sizeof a); int lab_len=strlen(lab); double rate=(int)(cur*100.0/tol);//当前下载了的百分比 int target=(int)(rate);//循环次数 while(i<=target){ printf("[%-100s][%.1lf%%][%c]\r",a,rate,lab[i%lab_len]); fflush(stdout); a[i++]=Style; } return ; }
ProgressBar.h
声明各种头文件,以及ProcBar函数的声明,为了提高代码的灵活性,使用一个回调函数作为调用模拟进度条函数的参数。
#include<stdio.h> #include<unistd.h> #include<string.h> typedef void(*callback_pb)(double,double);//函数指针 void ProcBar(double tol,double cur);
Main.c
main函数的定义,以及download函数的定义,download函数模拟了在网络中下载文件的情景。假设文件的大小以及网络带宽,实现了下载数据的与进度条的完成度的匹配。
#include"ProgressBar.h" void download(callback_pb cb){ //文件总大小 double filesize=1024*1024*100; //当前下载量 double current=0; //网络带宽 double bandwidth=1024*1024; printf("download begin,current: %.1lfMb\n",current/1024/1024); while(current<=filesize){ cb(filesize,current); usleep(100000);//单位是微秒 current+=bandwidth; } printf("\ndownload end,current: %.1lfMb\n",filesize/1024/1024); } int main(){ download(ProcBar); return 0; }