平常我们在linux下安装软件或者用yum安装一条新的指令的时候,都会出现这样的进度条
在实现它之前,我们首先需要具备的基础知识是区分换行和回车
换行 \n
回车 \r
很多童鞋会以为二者并没有很大的区别,其实还是有点区别的
但是我们平常使用换行的时候,也不是从上一行的结尾位置直接换到下一行开始打印,而是换到下一行的行首,这是因为这里默认\n为回车换行
再来看看两段代码
思考以上两个代码的输出结果,第一个输出有换行,第二个输出没有换行
结果:第一个先打印"hello world",然后休眠3s
第二个先休眠,后打印出来"hello world"
为什么会出现这样的结果呢?按道理执行代码都是从上往下执行的,而两段代码中打印语句都在休眠函数的前面,那么为什么会出现第二种情况呢?
只有一个原因,第二段代码中printf语句早已执行完,只不过没有被立马显示出来。
原来c语言会给我们提供输出缓冲区,根据特定的刷新策略,来进行刷新。而显示器设备,一般的刷新策略是行刷新,碰到\n,就会把\n之前的所有字符全部显示出来。第二段代码没有遇到\n,所以字符没有立马显示出来。
要想显示出来要加上 fflush(stdout);
加上后要打印的语句就会被立即显示出来
我们要实现进度条,是要在一行上不断输入一段字符串,并不是要换行打印,所以应该用\r,每一次打印完又回到行的最开始,且通过循环使每一次打印的字符串长度都不断增加,这样连续起来就会形成一个简单的进度条。
一起来浅浅欣赏下简易的进度条小程序吧
进度条源代码
#include <stdio.h>
2 #include <unistd.h>
3 #include <string.h>
4 #define Max 101
5 int main()
6 {
7 char bar[Max];
8 memset(bar,0,sizeof(bar));
9 const char*lable="|/-\\";
10 int count=0;
11 while(count<=100)
12 {
13 printf("[%-100s][%d%%]%c\r",bar,count,lable[count%4]);
14 bar[count++]='#';
15 fflush(stdout);
E> 16 iusleep(30000);
17 }
18 printf("\n");
19 }