文章目录

1. 预备知识
1.1 简单认识几个函数
1.1.1 sleep()
unsigned int sleep(unsigned seconds);
1.1.2 fflush()
int fflush(file* stream);
1.1.3 usleep()
int usleep(useconds_t usec);
1.1.4 memset()
void* memset(void* ptr, int value, size_t num);
1.2 缓冲区
直接上代码观察现象
#include <stdio.h>
#include <unistd.h>
int main()
{
printf("you can see me ");
sleep(3);
return 0;
}
执行效果图
1.3 回车与换行
首先我要抛出一个概念:回车和换行是不一样的!
2. 编写入门版的进度条
2.1 基本逻辑
2.2 美化效果
2.3 代码实现
// porcessbar.h
#pragma once
#include <stdio.h>
#define num 103
#define body '='
#define head '>'
// version 1
void process();
// processbar.c
#include "processbar.h"
#include <string.h>
#include <unistd.h>
const char* lable = "|/-\\";
// version 1
void process()
{
char buffer[num];
memset(buffer, '\0', sizeof(buffer));
int cnt = 0;
int n = strlen(lable);
buffer[0] = head;
while (cnt <= 100)
{
printf("[%-100s][%3d%%][%c]\r", buffer, cnt, lable[cnt % n]);
fflush(stdout);
buffer[cnt++] = body;
if (cnt < 100)
{
buffer[cnt] = head;
}
usleep(50000);
}
printf("\n");
}
2.4 执行效果
3. 编写升级版的进度条
3.1 代码实现
// processbar.h
#pragma once
#include <stdio.h>
#define num 103
#define body '='
#define head '>'
typedef void (*callback_t)(double); // 函数指针类型
// version 2
void process_flush(double rate);
// processbar.c
#include "processbar.h"
#include <string.h>
#include <unistd.h>
const char* lable = "|/-\\";
// version 2: 进度是多少,你进度条能知道吗?另外,什么进度?依附于其他应用的,比如下载
char buffer[num] = {0};
void process_flush(double rate)
{
static int cnt = 0;
int n = strlen(lable);
if (rate <= 1.0)
{
buffer[0] = head;
}
printf("[%-100s][%.1f%%][%c]\r", buffer, rate, lable[cnt % n]);
fflush(stdout);
buffer[(int)rate] = body;
if ((int)rate + 1 < 100)
{
buffer[(int)(rate + 1)] = head;
}
if (rate >= 100.0)
{
printf("\n");
}
cnt++;
cnt %= n;
}
// main.c
#include "processbar.h"
#include <time.h>
#include <stdlib.h>
#include <unistd.h>
// 模拟文件大小
#define filesize (1024 * 1024 * 1024)
// 模拟一种场景,表示一种下载任务
void download(callback_t cb) // 回调函数的形式
{
srand(time(null) ^ 1023); // 这样写只是为了让随机数更随机
int total = filesize;
while (total)
{
usleep(10000); // 下载动作
int one = rand() % (1024 * 1024); // 一次下载的大小
total -= one;
if (total < 0)
{
total = 0;
}
// 当前的进度是多少?
int download = filesize - total;
double rate = (download * 1.0 / filesize) * 100.0;
cb(rate);
}
}
int main()
{
download(process_flush);
return 0;
}
发表评论