在Linux上编写进度条

一.进度条的概念

进度条即计算机在处理任务时,实时的,以图片形式显示处理任务的速度,完成度,剩余未完成任务的大小,和可能需要处理的时间,一般以长方形条状形式显示。

二.进度条的几个要素

显示进度条必备的几个要素有完成任务的百分比,任务进行状态的显示和已完成任务的多少表示。本文采用数字描述完成任务的百分比,用符号'-','/','|','\'来表示任务进行的状态,用连续的'#'表示已完成的任务量。同时为了显示过程,还应该延缓时间。

三.进度条的一些版本

由以上分析,可以写出第一个版本:

#include                                                                                                                       
  2 #include                                                                                                                      
  3 int main()                                                                                                                              
  4 {                                                                                                                                       
  5   char string[4]={'-','/','|','\\'};                                                                                                    
  6   char buf[100]={0};                                                                                                                    
  7   int i=0;                                                                                                                              
  8   for(;i<=100;i++)                                                                                                                      
  9   {                                                                                                                                     
 10     printf("[%d]",i);                                                                                                                   
 11     printf("[%c]",string[i%4]);                                                                                                         
 12     buf[i]='#';                                                                                                                         
 13     printf("%s\n",buf);                                                                                                                   
 14     usleep(100*1000);                                                                                                                   
 15   }                                                                                                                                     
 16   return 0;                                                                                                                             
 17 }                                                                                                                                       
~                                                                                                                                                                     

部分结果图: 

在Linux上编写进度条_第1张图片

该版本很久才能出来结果,而且结果是输出了100行。

结果很久才能出来的原因:数据当前还在缓冲区。printf语句把要输出的数据都存在缓冲区里,只有缓冲区的数据满了,才会一块输出。

改进:使用fflush(stdout)函数,把标准输出的函数输出到显示屏。

输出100行的原因:使用了\n,\n是换行的意思。循环100次,输出100行。

改进:把\n换为\r,\r是回车符,使光标回到该行起始位置,不会另起新行。而\n换行,会另起新行。

改进的版本二为:

 #include                                                                                                                       
  2 #include                                                                                                                      
  3 int main()                                                                                                                              
  4 {                                                                                                                                       
  5   char string[4]={'-','/','|','\\'};                                                                                                    
  6   char buf[100]={0};                                                                                                                    
  7   int i=0;                                                                                                                              
  8   for(;i<=100;i++)                                                                                                                      
  9   {                                                                                                                                     
 10     printf("[%d]",i);                                                                                                                   
 11     printf("[%c]",string[i%4]);                                                                                                         
 12     buf[i]='#';                                                                                                                         
 13     printf("%s\r",buf);                                                                                                                 
 14     fflush(stdout);                                                                                                                     
 15     usleep(100*1000);                                                                                                                   
 16   }                                                                                                                                     
 17   return 0;                                                                                                                             
 18 }    

结果实现了在一行中,动态显示进度。但是颜色全为黑色,为了更美观,下面对进度设置颜色,实现版本三。

#include                                                                                                                       
  2 #include                                                                                                                      
  3 #define BLACK "\e[0;30m"                                                                                                                
  4 #define YELLOW "\e[1;33m"                                                                                                               
  5 #define GREEN "\e[0;32m"                                                                                                                
  6 #define BLUE "\e[0;34m"                                                                                                                 
  7 #define RED "\e[0;31m"                                                                                                                  
  8 int main()                                                                                                                              
  9 {                                                                                                                                       
 10   char string[4]={'-','/','|','\\'};                                                                                                    
 11   char buf[100]={0};                                                                                                                    
 12   int i=0;                                                                                                                              
 13   for(;i<=100;i++)                                                                                                                      
 14   {                                                                                                                                     
 15     buf[i]='#';                                                                                                                         
 16     printf(BLACK"[%d]",i);                                                                                                              
 17     if(i<=25)                                                                                                                           
 18     {                                                                                                                                   
 19        printf(YELLOW"[%c]",string[i%4]);                                                                                                
 20        printf(YELLOW"[%s]\r",buf);                                                                                                      
 21     }                                                                                                                                   
 22     else if(i<=50)                                                                                                                      
 23     {                                                                                                                                   
 24       printf(GREEN"[%c]",string[i%4]);                                                                                                  
 25       printf(GREEN"[%s]\r",buf);                                                                                                        
 26     }                                                                                                                                   
 27     else if(i<=75)                                                                                                                      
 28     {                                                                                                                                   
 29       printf(BLUE"[%c]",string[i%4]);                                                                                                   
 30       printf(BLUE"[%s]\r",buf);                                                                                                         
 31     }                                                                                                                                   
 32     else{                             
 33        printf(RED"[%c]",string[i%4]);                                                                                                     
 34        printf(RED"[%s]\r",buf);                                                                                                           
 35     }                                                                                                                                   
 36     fflush(stdout);                                                                                                                     
 37     usleep(100*1000);                                                                                                                   
 38   }                                                                                                                                     
 39   return 0;                                                                                                                             
 40 }             

最终实现彩色的进度条。

四.编写进度条涉及的几个点

1.\r与\n的区别

\n:换行,会重新起行。

\r:回车符,不换行,使光标回到该行起始处。

2.sleep和usleep

二者都是控制系统休眠,sleep以秒为单位,usleep以微秒为单位。本文中设置了0.1秒。

3.fflush函数

fflush函数常用于处理磁盘文件,fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中。本文中fflush将缓冲区的数据写到标准输出流stdout中。

4.unistd头文件

unistd头文件是Linux系统编程中最重要的头文件,包含了操作系统对程序员提供的API(应用系统编程接口)。

 

 

你可能感兴趣的:(Linux)