前言
回车(\r):让光标回到当前行的最左端
换行(\n):让光标回到下一行的最左端,同时刷新缓冲区
makefile文件的建立以及使用:
一、简单写法
1.processbar.h
#pragma once
#include<stdio.h>
#define NUM 102
#define TOP 100
#define BODY '='
#define RIGHT '>'
extern void processbar(int speed);
2. processbar.c
#include"processbar.h"
#include<string.h>
#include<unistd.h>
const char *lable="|/-\\";
void processbar(int speed){
char bar [NUM];
memset(bar,'\0',sizeof(bar));
int len=strlen(lable);
int cnt=0;
while(cnt<=TOP){
printf("[%-100s][%d%%][%c]\r",bar,cnt,lable[cnt%len]);
//打印的时候在【】内预留100个位置,并且左靠齐打印
//lable【cnt%len】模拟下载的动态效果
//并且打印完一次后让光标对齐到最左侧,为下一次覆盖打印做铺垫
fflush(stdout);
bar[cnt++]=BODY;
if(cnt<100){
bar[cnt]=RIGHT;
}
usleep(speed);
//进行休眠
}
printf("\n");
}
3.main.c
#include"processbar.h"
#include<unistd.h>
int main(){
processbar(10000);
return 0;
}
二、使用回调函数
1.processbar.h
#include<stdio.h>
#define NUM 102
#define TOP 100
#define BODY '='
#define RIGHT '>'
extern void processbar(int rate);
extern void init();
2. processbar.c
#include"processbar.h"
#include<string.h>
#include<unistd.h>
const char *lable="|/-\\";
char bar[NUM];
void processbar(int rate){
if(rate<0||rate>100){
return ;
}
int len=strlen(lable);
printf("[%-100s][%d%%][%c]\r",bar,rate,lable[rate%len]);
fflush(stdout);
bar[rate++]=BODY;
if(rate<100){
bar[rate]=RIGHT;
}
}
void init(){
//重新初始化,清空数组内容
memset(bar,'\0',sizeof(bar));
}
3.main.c
#include"processbar.h"
#include<unistd.h>
typedef void (*callback_t)(int);
//类型为void (* )(int)的函数指针
void DownLoad(callback_t cb){
int total=1000;
int cur=0;
while(cur<=total){
usleep(50000);
int rate=cur*100/total;
//算出比例
cb(rate);
//每次cur增加都调用一次cb函数
//也就是processbar函数
cur+=10;
}
printf("\n");
}
int main(){
DownLoad(processbar);
init();
DownLoad(processbar);
return 0;
}