实现一个简单的进度条

   我们平常在下载软件或者安装软件时都会看到进度条,下面我们分析一下,并实现一个简易的进度条

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
 执行完之后记得清理解决方案

 

posted @ 2017-01-12 11:32  xmc_2022  阅读(2015)  评论(4编辑  收藏  举报