linux下实现进度条
-----首先我们得了解一下进度条的原理
1.全缓冲 ,全缓冲指的是系统在填满标准IO缓冲区之后才进行实际的IO操作;注意,对于驻留在磁盘上的文件来说通常是由标准IO库实施全缓冲。
2.行缓冲,在这种情况下,标准IO在输入和输出中遇到换行符时执行IO操作;注意,当流涉及终端的时候,通常使用的是行缓冲。
3.无缓冲,无缓冲指的是标准IO库不对字符进行缓冲存储;注意,标准出错流stderr通常是无缓冲的。
printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下:
(1)缓冲区填满;
(2)写入的字符中有‘\n’ ,'\r';
(3)调用fflush手动刷新缓冲区;
(4)调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新;
满足上面4个条件之一缓冲区就会刷新
所以在这个进度条程序中,我们选择手动刷新也就是使用这个fflush进行手动的刷新缓存区。而我们在Printf的时候也使用\r来进行行刷新。而在上面的usleep则是以微妙时间进行睡眠,因为进度条如果一下就完成了我们就不需要他了,为了更直观地显示出来,我们需要让他显示地慢一点。而ptr的设定则是为了说明我们的进度条程序是在进行中的,刷新起来就是在旋转一般。这样一来我们的进度条程序就完成了
代码实现:
color.h
1 #define NONE "\033[m" 2 #define RED "\033[0;32;31m" 3 #define LIGHT_RED "\033[1;31m" 4 #define GREEN "\033[0;32;32m" 5 #define LIGHT_GREEN "\033[1;32m" 6 #define BLUE "\033[0;32;34m" 7 #define LIGHT_BLUE "\033[1;34m" 8 #define DARY_GRAY "\033[1;30m" 9 #define CYAN "\033[0;36m" 10 #define LIGHT_CYAN "\033[1;36m" 11 #define PURPLE "\033[0;35m" 12 #define LIGHT_PURPLE "\033[1;35m" 13 #define BROWN "\033[0;33m" 14 #define YELLOW "\033[1;33m" 15 #define LIGHT_GRAY "\033[0;37m" 16 #define WHITE "\033[1;37m"
process.c
1 #include<stdio.h> 2 #include<unistd.h> 3 #include"color.h" 4 #define M 101 5 int main(){ 6 int i=0; 7 char bar[M]={'0'}; 8 char symbol[4]={'-','\\','|','/'}; 9 for(i=0;i<M;i++){ 10 int color =i%4; 11 switch(color) 12 { 13 case 0: 14 printf(RED); 15 break; 16 case 1: 17 printf(GREEN); 18 break; 19 case 2: 20 printf(BLUE); 21 break; 22 case 3: 23 printf(BLUE); 24 break; 25 } 26 bar[i]='#'; 27 printf("[%-100s][\%d][%c]\r",bar,i,symbol[i%4]); 28 fflush(stdout); 29 usleep(10000); 30 } 31 printf("\033[0m"); 32 printf("\n"); 33 return 0; 34 }
结果展示: