效果展示
录屏2023
一、建立文件
mkdir ProgressBar //在当前目录下,建立新的目录
cd ProgressBar //进入这个目录
touch main.c makefile progressbar.c progressbar.h //在ProgressBar这个目录建立这几个文件
进入ProgressBar这个目录之后,使用ls命令查看是否创建成功
二、编写makefile文件
编写makefile文件是为了,使用make命令构建我们的.c文件,生成可执行程序
progressbar:progressbar.c main.c
gcc -o $@ $^
.PHONY:clean
clean:
rm -f progressbar
三、源码
把源码复制粘贴到我们对应的文件中
1. 头文件.h
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <time.h>
#include <stdlib.h>
#define DOWNLOAD 1024*1024*1024 //1GB,下载的总大小
#define MAX 102 //str数组的长度
#define S '=' //数组的进度表示符号
void ProgressBar(); //函数声明
使用vim指令先打开头文件
vim progressbar.h
按小写i,进入插入模式(Insert),直接拷贝上去
再按esc,直接输入:wq(必须手动输入,这里不可以复制,而且必须有分号)
esc是让我们进入底行模式,按:wq是保存并退出,之后按同样的步骤完成下面几个文件的拷贝
2. 写函数定义的.c文件
#include "progressbar.h"
char str[MAX] = "\0"; //这里要定义一个全局字符数组,防止每次调用这个函数都要开辟空间,销毁空间,影响效率
char *ch = ". "; // 这个字符串是为了表示下载一直在进行中,即使下载卡顿,也会转动,表示一直在下载;这里ch的字符串可以自己设定转动的字符,我这里设置的是.和空格,表示闪烁
int i = 0; // 全局变量i,控制表示下载进行中的转动速度
void Init(int p) //初始化进度条的内容,根据下载百分比来的,用图形表示当前的进度
{
char *cur = str;
for(int j = 0; j < p; j++)
{
str[j] = S;
}
}
void ProgressBar(double percentage) //完成打印进度条的工作
{
int len = strlen(ch); //len是ch字符串的长度,让ch这个字符串一直在循环输出
int p = (int)percentage; //这里强转一下percentage是因为,p是表示str数组的下标
if(percentage >= 100) //如果下载百分比达到100.或者是大于100,就让他是100,符合我们日常逻辑
percentage = 100;
Init(p); //得知下载百分比之后,进入初始化str
printf("[%-100s][%.2f%%][%c]\r", str, percentage, ch[i%len]); //这里就是打印进度条
fflush(stdout); //强制刷新缓冲区
i++; //让i不断增大
i %= len; //但是不能超过ch的长度
}
3. main函数的.c文件(函数调用的文件)
#include "progressbar.h"
void DownLoad()
{
srand(time(NULL)^1023); //设置一个随机数,用来分配速度
int download = DOWNLOAD; //下载总量,可以自己设定
int alreadydown = 0; //已经下载的大小
double percentage = 0; //下载百分比
int v = 0; //下载速度
while(alreadydown < download) //循环条件就是我们下载量是否大于总大小
{
usleep(100000); //休眠时间
v = rand()%(1024*1024*40); //从随机数赋值速度,%后面的数字,是为了不让这个速度超过这个数字
alreadydown += v; //每次下载累积
percentage = alreadydown*100.0 / download; //下载百分比*100,让我们更好查看,否则下完百分比是0.99,1.00等不好看
ProgressBar(percentage); //调用函数,这里函数主要完成打印进度条
}
printf("\n安装完毕!\n");
}
int main()
{
DownLoad();
return 0;
}
四、运行
拷贝完成后,直接使用下面指令
make
然后ls一下,会看到有一个可执行程序生成
运行这个可执行程序
./progressbar
至此我们就可以看到进度条的生成了~
五、处理
如果想删除所有文件
rm -rf *
cd ..
rm -rf ProgressBar