赞
踩
在计算机执行任务的时候,进度条会以一种实时的,以图片、符号等显示处理任务的速度、完成度及剩余任务量的大小、百分比等来呈现给我们,比如我们在下载东西,观看视频时的缓冲区,拷贝大文件的时候都会看到它的缩影。
实现的进度条功能
设置一个区间可以显示100个#字符,左右区间各有一个中括号,但是中括号位置固定不变,在方括号内,我们用#字符来对其填充,每隔一段时间,进度条刷新一个#字符,同时在右括号的外面放置一个实时显示进度的百分比计数器,直到区间被填充满为止。
设计思想
①实时显示:利用fflush(stdout),清空标准输出缓冲区,在C语言中,缓冲区是以行形式读取和存储的,所以若未遇到\n回车换行,缓冲区不会将数据立刻显示出来,而是进入sleep函数,但是实际上最新被执行的仍然是sleep之前的程序,因为没有\n出现,因此数据会被先暂放在缓冲区内,使用fflush强制刷新就可以实时的显示。
②进度条的递增:这里用到的是覆盖的思想,就是说第一次显示一个#,第二次从最左边开始显示2个#,以此类推。实现这样的功能也很简单,在C/C++中,\n代表的是回车换行,回车与换行时两个动作,回车是回到当前行的行首,换行时换到下一行,这里我们使用\r来回车。
进度条Demo源代码(vs2017)
#include
#include
#include
int main()
{
char bar[102];//102表示进度条从0-100这101个数加上1个'\'回车符
int i = 0;
bar[0] = '\0';
const char *p = "-\\|//";//字符串表示进度条显示的进度比率后面的动态变化
memset(bar, 0, sizeof(bar));//初始化为0
while (i <= 100)
{
bar[i] = '#';//进度条的形状
printf("[%-101s][%d%%][%c]\r", bar, i, p[i % 4]);
//\r:直接退回首部,不断覆盖 i%4:字符串的每一个字符交替动态显示,进行覆盖
fflush(stdout);//刷新标准输出缓冲区,因为没有遇到\n符,所以需要强制刷新
i++;
Sleep(100);
}
printf("\n");
system("pause");
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include
#include
#include
intmain()
{
charbar[102];//102表示进度条从0-100这101个数加上1个'\'回车符
inti=0;
bar[0]='\0';
constchar*p="-\\|//";//字符串表示进度条显示的进度比率后面的动态变化
memset(bar,0,sizeof(bar));//初始化为0
while(i<=100)
{
bar[i]='#';//进度条的形状
printf("[%-101s][%d%%][%c]\r",bar,i,p[i%4]);
//\r:直接退回首部,不断覆盖 i%4:字符串的每一个字符交替动态显示,进行覆盖
fflush(stdout);//刷新标准输出缓冲区,因为没有遇到\n符,所以需要强制刷新
i++;
Sleep(100);
}
printf("\n");
system("pause");
return0;
}
Gcc实现进度条Demo
这些小Demo还是比较有趣的,虽然实现的代码很少,但是这样一个程序可以让我们熟悉一下编程中实时性,以及对回车换行的误解,所以还是有必要阐述一下的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。