简易动态进度条实现

来源:互联网 发布:csgom4a1皮肤知乎 编辑:程序博客网 时间:2024/05/29 17:04

在生活中我们随处可见进度条,下面我们来实现一个能够动态变化简易的进度条。
分析:在这里所谓的动态变换其实不是真的让它进行动态变换,而是利用人眼的视觉暂留现象,当进度条显示出来的时候看起来像是动态变换的。
这里写图片描述
如上图:
最开始用一个”=”表示进度是1%,当把这个进度的状态显示完毕之后,我们再回到这一行的开始位置输出两个”=”表示2%。原理就是这样,比较简单的,但是在这里面我们需要注意两个问题,首先是缓冲区问题,其次就是回车和换行的问题。

作为扩展的话我们有必要先来简单了解一下缓冲区:
1、为什么要引入缓冲区???
我们知道,在计算机中cpu的速度要远大于内存的速度,内存的速度要远大于磁盘的速度。为了提高cpu工作效率所以引入了缓冲区。缓冲区就是一块内存区,它在输入输出设备和cpu之间,用来缓存数据,使得低速的输入输出设备和告诉的cpu之间能够协调工作,避免低速的输入输出设备占用cpu,解放出cpu使其能够高效率工作。

2、缓冲区可以分为无缓冲、行缓冲、全缓冲三种形式。
无缓冲:
无缓冲就是不进行缓冲,标准错误流stderr就是典型的代表,这使得出错信息可以快速直接的显示出来。

行缓冲:
在这种情况下,当在输入和输出中遇到换行符时才执行真正的I/O操作。这时候我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是键盘的操作。

全缓冲:
在这种情况下,当写满标准I/O缓存后才进行实际的I/O操作。全缓冲的典型代表是对磁盘文件的读写。

4、刷新缓冲区:
在c语言中,提供了fflush()函数来刷新缓冲区,强制缓冲区内的数据进行标准I/O操作。
函数原型:int fflush(FILE *stream);其中文件流包括:stdin标准输入流,标准输出流stdout,标准错误流stderr流。

5、回车换行
回车用”\r”表示,换行用”\n”表示。回车表示回到这一行的起始位置,换行表示换到下一行。所以,在我们将一行写满之后跳到下一行的过程中,其实做了两件事,首先是回到当前行的起始位置,其次是换到下一行。

通过上面的了解之后,实现这个进度条的话我们应该选择无缓冲的方式,实时更新进度条的信息,其次在进度条中我们不需要换行,只需要回车即可。我们还可以在后面加上百分比和游标,游标就是标识进度条的工作状态。

代码实现:

#include<stdio.h>#include<unistd.h>void procBar(){       int rate=0;       char bar[102];       bar[0]='\0';       const char* symbol="-/|\\";       while(rate<101)       {              printf("[%-100s] [%d%] %c\r",bar,rate,symbol[rate%4]);              fflush(stdout);              bar[rate]='=';              rate++;              bar[rate]='\0';              usleep(100000);       }       printf("\n");}#include"procBar.h"#include<stdio.h>int main(){       procBar();       return 0;}里写代码片

结果:
这里写图片描述

3 0