目录
编辑
一,进度条的第一个版本
1.准备工作
2.写Makefile文件
3.开始构建进度条
1. process.h文件
2. process.c文件
3.main.c文件
二,进度条的第二个版本
1.为什么还要写第二个版本?
2.如何升级?
3.升级代码
1.搭建场景
一,进度条的第一个版本
1.准备工作
在写进度条之前,我们得把前期的准备工作做好。这些准备工作便是准备好三个文件,这三个文件便是:main.c process.c process.h。如下:
2.写Makefile文件
在前面的学习中我们有学习到使用Makefile文件来自动化构建项目,所以在这里我们便可以用起来。首先便是创建Makefile/makefile文件。注意文件名必须是前面两个名字中的一个。所以我们创建Makefile/makefile文件如下:
然后我们便使用vim打开Makefile文件,开始写我们的代码,代码如下:
process:main.c process.c 2 @gcc @$^ -o $@ 3 .PHONY:clean 4 clean: 5 @rm -f process
这个文件便是我们的Makefile文件,相信大家能看懂。
3.开始构建进度条
1. process.h文件
在这个文件里头我们要做的便是将我们在写代码时需要使用到的头文件和一些宏定义放入到该文件中。所以我们在写进度条时首先要想明白的便是我们该如何构建进度条这个代码?如何构建呢?不管如何构建我们都要使用stdio.h这个头文件。因为在写进度条时会有需要有休眠的操作所以就得有usleep的头文件——unistd.h。剩下的便是一些宏定义和函数声明了,我的头文件代码如下:
#include<stdio.h> 2 #include<unistd.h> 3 #include<string.h> 4 #define STIME 12345//休眠时间,以微妙为单位 5 #define MAX_SIZE 100//进度条的最大长度 6 #define STYLE '#'//进度条的风格 7 void process_v1();//函数声明
2. process.c文件
在这个文件里头我们要写的便是进度条的实现逻辑,但是我们的先来看看我们的进度条长啥样?先来看看我们的进度条:
这个进度条里面有啥呢?首先便是一个字符串,这个字符串有一百个字符,然后这个进度条还有一个表示进度的百分率的东西,还有一个旋转光标。
我们该如何实现这些功能呢?代码如下:
#include"process.h" 2 void process_v1() 3 { 4 int rate = 0;//进度表示数 5 char bar[MAX_SIZE] = {0};//进度条,刚开始时初始化为0,因为时字符0所以不会显示出来。 W> 6 char* str = "\\|/-";//表示旋转光标 7 int num = strlen(str);//计算str的长度 8 while(rate<=MAX_SIZE) 9 { 10 printf("[%-100s][%d%%][%c]\r",bar,rate,str[rate%num]);//打印,记得使用\r表示回车 11 usleep(STIME);//休眠 12 fflush(stdout);//刷新 13 bar[rate++] = STYLE;//给字符串bar添加字符并且让rate++ 14 15 } 16 printf("\n"); 17 }
在写完这个代码以后我们的第一个版本的进度条便完成了。
3.main.c文件
main.c文件的实现极其简单,因为这个文件的功能十分的单一。在这个文件里需要做的便是写一个main函数调用我们的void process()函数便可以了。所以这个代码书写如下:
#include"process.h" int main() { process(); return 0; }
写完这个文件里的内容以后我们再make并执行一下便可以生成一个进度条如下:
到此我们的第一个版本的进度条便写完了,完美撒花!!!
二,进度条的第二个版本
1.为什么还要写第二个版本?
在这里解释一下为什么需要写第二个版本的进度条呢?这是因为我们的进度条的使用场景是在下载的过程中使用的,要是写成第一种版本的进度条我们就不好调用了。也实现不了在下载的场景下使用的功能。所以我们得将这个版本的进度条升级一番。
2.如何升级?
这个进度条的升级说来也容易,但是不好说,还是来看看我写的代码吧。
3.升级代码
1.搭建场景
这个场景的搭建是在main.c文件下面,搭建的场景是一个下载的场景。搭建场景如下:
void download() { int total = 0;//这个total就表示当前下载的进度 int target = TARGET;//这是我们要下载的目标文件的总大小 while(total<=target) { total+=DSIZE;//每次下载的大小 process_v2(total*100/target); usleep(STIME);//休眠时间 } printf("\n"); }
在这个场景下我们的版本升级代码如下:
void process_v2(int rate) 20 { 21 22 static char bar[MAX_SIZE] = {0}; W> 23 char* str = "\\|/-"; 24 int num = strlen(str); 25 if(rate>=0&&rate<=100) 26 { 27 printf("[%-100s][%d%%][%c]\r",bar,rate,str[rate%num]); 28 bar[rate] = STYLE; 29 30 usleep(STIME); 31 fflush(stdout); 32 33 } 34 35 36 }
其实这个代码的升级也没有多少,这里的改进便是将原来放到函数里的循环给放到外面了。