受了李大神这篇文章的启发:http://blog.csdn.net/absurd/article/details/761943
于是我也自己亲手实现了一个简易版本的更新进度条,只要传入一个大于100的整型数即可。
#include <stdio.h>
#include <Windows.h>
#include <unistd.h>
//定义设置光标结构体变量
CONSOLE_CURSOR_INFO cci;
//定义默认的坐标位置
COORD pos = {0,0};
HANDLE hOut;
/*
10000
/10000%1000
/1000%100
/100%10
%10
*/
#define AEF 0x8
#define exp 1.39
#define TITLE "进度条"
typedef void (*work_ptr)(int * , int *);
void show_process(int *cnt , int *num)
{
int flag = 1 ;
int tmp = *num ;
int tmp1 = *cnt ;
int multiple = 0;
static int _flag ;
static int count = 0 ;
if(tmp1 >= 100) {
multiple = (int)(tmp1/100*100/100);
flag = 1 ;
}
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | 0x8);
pos.X = 73 ;
pos.Y = 15 ;
SetConsoleCursorPosition(hOut,pos);
if(flag)
{
printf("%d%%",tmp/multiple);
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | 0x8);
pos.X = 76 ;
pos.Y = 15 ;
SetConsoleCursorPosition(hOut,pos);
switch(_flag)
{
case 0: printf("[%c]",'\\'); _flag = 1 ; break ;
case 1: printf("[%c]",'/'); _flag = 0 ; break ;
}
SetConsoleTextAttribute(hOut, FOREGROUND_GREEN | AEF);
pos.X = (int)((tmp/multiple)/exp);
pos.Y = 15 ;
SetConsoleCursorPosition(hOut,pos);
printf("=>") ;
}
return ;
}
void run_go(int cnt ,work_ptr ptr)
{
int i ;
int count = 0 ;
cnt = cnt/100*100;
if(cnt < 100) return ;
for(i = 0 ; i < cnt ; i++)
{
count++ ;
ptr(&cnt,&count);
sleep(1);
//usleep(1111000);
}
}
int main(void)
{
hOut = GetStdHandle(STD_OUTPUT_HANDLE);
GetConsoleCursorInfo(hOut, &cci);
SetConsoleTitleA(TITLE);
cci.bVisible = 0;
SetConsoleCursorInfo(hOut, &cci);
run_go(111,show_process);
system("cls");
run_go(132,show_process);
system("cls");
run_go(198,show_process);
system("cls");
run_go(325,show_process);
system("cls");
run_go(546,show_process);
return 0 ;
}
运行结果: