界面呢非常简洁,代码也非常简单,非常适合有用来练手或者消遣。
以下就是进度条的样子咯,感兴趣的朋友可以自己去“美化”一下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; }