linux下实现进度条

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 }   

结果展示:

扫描二维码关注公众号,回复: 893540 查看本文章


猜你喜欢

转载自blog.csdn.net/sx2448826571/article/details/79717302