Linux下实现进度条(原理版本和真实版本)
Linux下实现进度条(原理版本和真实版本)
文章目录
- Linux下实现进度条(原理版本和真实版本)
- 一、准备知识
- 1.1 回车和换行
- 2.2 缓冲区问题
- 3.3 一段测试代码
- 二、文件准备工作
- (1)创建文件
- (2)Makefile配置
- (3)头文件process.h
- (4)源文件process.c
- (5)源文件main.c
- 三、进度条类型
- 3.1 版本1:原理版本
- 3.2 版本2:真实版本
- 3.3 版本2:小优化
- 四、整体代码
- (1)Makefile文件
- (2)main.c
- (3)process.c
- (4)process.h
一、准备知识
1.1 回车和换行
2.2 缓冲区问题
3.3 一段测试代码
二、文件准备工作
(1)创建文件
(2)Makefile配置
(3)头文件process.h
头文件process.h的作用主要是声明
(4)源文件process.c
(5)源文件main.c
三、进度条类型
3.1 版本1:原理版本
我们每次打印的进度条都是在命令行。我们应该新起一行
3.2 版本2:真实版本
先在main函数里面写一个下载程序,充当下载数据
在这里我们还要定义一个FlushProcess函数来刷新进度条
这里也要通过Makefile改成C99标准库
所以接下来我们就开始process.c的第二版本的建立
接下来我们要加上数量和%,并进行优化
这里加上了rate来记录速率!定义了cnt来计数
这里有个小问题:别忘了cnt++,要不然无法达到转圈的效果
但是我们注意到这里只有 99.9%,因为我们while循环中没有等号
我们还可以实现多组下载!
3.3 版本2:小优化
这里我们可以使用函数指针和回调函数优化
四、整体代码
(1)Makefile文件
代码如下(示例):
1 SRC=$(wildcard *.c)2 OBJ=$(SRC:.c=.o)3 BIN=LinuxStudy4 5 $(BIN):$(OBJ)6 gcc -o $@ $^7 %.o:%.c8 gcc -c $< -std=c99 9 10 .PHONY:11 clean:12 rm -f $(OBJ) $(BIN)13
(2)main.c
代码如下(示例):
$ cat main.c
#include "process.h"
#include <stdio.h>
#include <unistd.h>
double total = 1024.0;
double speed = 1.0;
void DownLoad()
{
double current = 0;
while(current <= total)
{
FlushProcess(total, current);
// 下载代码
usleep(3000); // 充当下载数据
current += speed;
}
printf("\ndownload %.2lfMB Done\n", current);
}
int main()
{
DownLoad();
DownLoad();
DownLoad();
DownLoad();
DownLoad();
DownLoad();
DownLoad();
DownLoad();
return 0;
}
(3)process.c
代码如下(示例):
#include "process.h"
#include <string.h>
#include <unistd.h>
#define NUM 101
#define STYLE '='
// vesion1
void process_v1()
{
char buffer[NUM];
memset(buffer, 0, sizeof(buffer));
const char *lable="|/-\\";
int len = strlen(lable);
int cnt = 0;
while(cnt <= 100)
{
printf("[%-100s][%d%%][%c]\r", buffer, cnt, lable[cnt%len]);
fflush(stdout);
buffer[cnt]= STYLE;
cnt++;
usleep(50000);
}
printf("\n");
}
// verison2
void FlushProcess(double total, double current)
{
char buffer[NUM];
memset(buffer, 0, sizeof(buffer));
const char *lable="|/-\\";
int len = strlen(lable);
static int cnt = 0;
// 不需要⾃⼰循环,填充#
int num = (int)(current*100/total); // 11.0 / 1000
int i = 0;
for(; i < num; i++)
{
buffer[i] = STYLE;
}
double rate = current/total;
cnt %= len;
printf("[%-100s][%.1f%%][%c]\r", buffer, rate*100, lable[cnt]);
cnt++;
fflush(stdout);
}
(4)process.h
代码如下(示例):
#pragma once
#include <stdio.h>
void process_v1();
void FlushProcess(double total, double current);