简易进度条的实现

引子
看如下程序:
简易进度条的实现_第1张图片

运行这个程序
简易进度条的实现_第2张图片
结果发现三秒过后会先输出haha 然后再输出hehe。(这个停留的三秒要自己去亲测感受一下,在图片上是看不出来的)

接着看,当把sleep(3);放到fprintf(stderr,"haha");后边,然后再运行,会发现,会先输出haha,过三秒之后才会输出hehe
简易进度条的实现_第3张图片
这是为什么呢?
其实输出函数printf在输出字符串“hehe”时,并不是说输入一个字符就将其输出,而是将它放入到内核的缓存区中,等待一些特定的时机才输出。
输出缓存区在遇到如下四种情况才会刷新到目标位置
1、遇到换行符 \n
2、遇到fflush(stdout)
3、当关联了scanf之类的输入
4、当程序退出(exit)或者main函数退出
5、当内核的缓存区满了
标准出错是不会缓存的,因为标准出错(stderr)相当于是很紧急的情况,既然是很紧急的情况就不会按照普通事件那样处理了。
知道了这些,我们可以来试着实现一下进度条了(之前一篇博客刚讲了Makefile和make的使用,为了将其练习巩固一下,在这里就使用Makefile来管理我们的进度条,如果读者觉得没必要用Makefile的话,文章末尾附有完整代码,可以只创建一个文件来实现)

首先创建几个源文件,并将程序分别写入对应的源文件中。
使用命令 vim jindutiao.h 打开jindutiao.h文件,按 i 后输入下列内容
简易进度条的实现_第4张图片
使用指令:wq保存退出之后
使用命令vim jindutiao.c 打开 jindutiao.c文件,按 i 后输入以下内容
简易进度条的实现_第5张图片
使用指令:wq保存退出之后
使用命令vim main.c  打开main.c文件,按 i 后输入以下内容
简易进度条的实现_第6张图片
源文件都编辑好了,接下来就是编辑Makefile文件了
使用命令 vim Makefile 打开Makefile文件,输入以下内容
简易进度条的实现_第7张图片
最后就是是使用make指令来编译这些源文件了
简易进度条的实现_第8张图片
到这里简易的进度条就已经实现成功了。(进度条应该是一个动态的过程,图片是不能看到这样一个动态过程的,需要读者自己亲自实现,来感受这个动态的过程)

下边附上完整的代码:
#include 
   #include 
  
   void Progress_Bar()
   {
       int i = 0;
       char buf[101] = "|";
      for(i = 1;i<= 100; i++)
     {
          printf("\033[42;34m[%-100s]\033[0m [%d%]\r",buf,i);
          buf[i]='|';
          fflush(stdout);
          usleep(100000);
    }
      printf("\n");
 }

int main()
{
       Progress_Bar( );
}
如果有读者不懂上边的Makefile和make的使用可以参见博文
http://m.blog.csdn.net/guaiguaihenguai/article/details/78701767
也可以将上述代码写入一个test.c(随便一个 .c 文件),然后保存退出,使用命令 gcc test.c编译,将生成一个可执行的a.out文件,使用命令 ./a.out将其执行,就可以看到最后结果了。这个非常简单,就不在这多做演示了。



你可能感兴趣的:(C语言)