一.进度条的概念
进度条即计算机在处理任务时,实时的,以图片形式显示处理任务的速度,完成度,剩余未完成任务的大小,和可能需要处理的时间,一般以长方形条状形式显示。
二.进度条的几个要素
显示进度条必备的几个要素有完成任务的百分比,任务进行状态的显示和已完成任务的多少表示。本文采用数字描述完成任务的百分比,用符号'-','/','|','\'来表示任务进行的状态,用连续的'#'表示已完成的任务量。同时为了显示过程,还应该延缓时间。
三.进度条的一些版本
由以上分析,可以写出第一个版本:
#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 }
~
部分结果图:
该版本很久才能出来结果,而且结果是输出了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(应用系统编程接口)。