实现一个简单的进度条
我们平常在下载软件或者安装软件时都会看到进度条,下面我们分析一下,并实现一个简易的进度条
1、首先我们用[]固定在左右两边,中间预留空间,然后用'='进行填充在这里我们用"="表示1%,通过增加字符
来保证进度的增加。printf("[%-100s]\r",str); 格式化输出。'-'表示左对齐 100表示列宽,'\r'表示回车,即每
次打印完使光标回到行首在这里需要解释一下'\r'和'\n'这两个概念
回车:'\r',表示回到当前行的行首
换行:'\n',表示光标进入下一行
2、加睡眠时间,如果不加睡眠时间,结果一下就全打印出来,那就不是进度条了。
linux下sleep时间单位为秒,这样的话感觉间隔时间有点长,于是又有了usleep函数
我们可以通过man 来查看这连个函数:
3、在观察程序输出结果是会发现它是一段一段显示,这和我们平常见到的
进度条不一样。究其原因,发现是printf()的原因,,printf是先将要输出的内容
写到缓冲区里,然后再刷新。
现在来看一下UNIX里面关于标准IO的几种缓冲机制:
<1>全缓冲:指的是系统在填满标准IO缓冲区之后,才进行实际的IO操作
;磁盘上的文件通常由标准IO库实施全缓冲
<2>行缓冲:标准IO在输入输出时遇到换行符(\n)的时候才将缓冲区的内容
写入到标准输入输出的磁盘文件。注意:当流涉及到终端时
通常使用的是行缓冲
<3>无缓冲:指的是标准IO库不对字符进行缓冲存储,
注意:标准出错流stderr通常是无缓冲。
printf()是一个行缓冲函数,先写到缓冲区中,满足刷新条件才将缓冲区的内容刷新到对应的文件中
,刷新缓冲区的条件如下:
(1)缓冲区已满;
(2)遇到\n;
(3)调用ffush手动刷新缓冲区;
(4)调用scanf()从缓冲区读取数据时,也会将缓冲区的数据刷新;
满足上面的任意一个条件缓冲区就会刷新
代码如下:
1 void Proc() 2 { 3 int rate = 0; 4 char str[102] = {0}; 5 const char* arr = "-\\|/"; 6 while(rate<=100) 7 { 8 str[rate]='='; 9 printf("[%-100s],%d%% ,[%c]\r",str,rate,arr[rate%4]) ; //%d%%d 打印百分比%%也可以用\%代替 10 rate++; 11 fflush(stdout); 12 usleep(1000000); 13 } 14 } 15 int main() 16 { 17 Proc(); 18 return 0; 19 }
效果展示:
4.最后补充一点,编写Makefile文件
直接输入make 就会生成Proc文件
执行程序命令 ./Proc
执行完之后记得清理解决方案