引子
看如下程序:
运行这个程序
结果发现三秒过后会先输出haha 然后再输出hehe。(这个停留的三秒要自己去亲测感受一下,在图片上是看不出来的)
接着看,当把sleep(3);放到fprintf(stderr,"haha");后边,然后再运行,会发现,会先输出haha,过三秒之后才会输出hehe
这是为什么呢?
其实输出函数printf在输出字符串“hehe”时,并不是说输入一个字符就将其输出,而是将它放入到内核的缓存区中,等待一些特定的时机才输出。
输出缓存区在遇到如下四种情况才会刷新到目标位置
1、遇到换行符 \n
2、遇到fflush(stdout)
3、当关联了scanf之类的输入
4、当程序退出(exit)或者main函数退出
5、当内核的缓存区满了
标准出错是不会缓存的,因为标准出错(stderr)相当于是很紧急的情况,既然是很紧急的情况就不会按照普通事件那样处理了。
知道了这些,我们可以来试着实现一下进度条了(之前一篇博客刚讲了Makefile和make的使用,为了将其练习巩固一下,在这里就使用Makefile来管理我们的进度条,如果读者觉得没必要用Makefile的话,文章末尾附有完整代码,可以只创建一个文件来实现)
首先创建几个源文件,并将程序分别写入对应的源文件中。
使用命令 vim jindutiao.h 打开jindutiao.h文件,按 i 后输入下列内容
使用指令:wq保存退出之后
使用命令vim jindutiao.c 打开 jindutiao.c文件,按 i 后输入以下内容
使用指令:wq保存退出之后
使用命令vim main.c 打开main.c文件,按 i 后输入以下内容
源文件都编辑好了,接下来就是编辑Makefile文件了
使用命令 vim Makefile 打开Makefile文件,输入以下内容
最后就是是使用make指令来编译这些源文件了
到这里简易的进度条就已经实现成功了。(进度条应该是一个动态的过程,图片是不能看到这样一个动态过程的,需要读者自己亲自实现,来感受这个动态的过程)
下边附上完整的代码:
#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将其执行,就可以看到最后结果了。这个非常简单,就不在这多做演示了。