关于进度条的实现,主要把握点就是动态修改,且是行内缓冲更新。
关于这点就需要了解printf()的行缓冲问题了
可以做如下验证
#include <stdio.h> #include <stdlib.h> int main() { // printf("test"); case1:3秒后输出 printf("test "); //case2:立即输出 sleep(3); return 0; }
两个case的区别就在于 了,所以问题的症结之处就是 了.
printf是一个行缓冲函数,先写到缓冲区,满足条件后,才将缓冲区刷到对应文件中,刷缓冲区的条件如下:
1 缓冲区填满。
2 写入的字符中有‘
’, '
'。
3 调用fflush手动刷新缓冲区。
4 调用scanf要从缓冲区中读取数据时,也会将缓冲区内的数据刷新。
满足上面4个条件之一缓冲区就会刷新,也就是printf会真正调用write来写入。
当我们执行printf的进程或者线程结束的时候会主动调用flush来刷新缓冲区,所以程序结束,也会刷新。
对于以上几点,都是很容易进行验证的,这里就不分开谈论了
关于进度条。
有了行缓冲问题的了解,那么我们就可以把握主更新缓冲的时机以及方式了。
进度条前进时更新缓冲重新写入,方法的话就是 了。因为我们的进度条是行 行为了
代码实现
#include <stdio.h> #include <string.h> void proc() { int rate = 0; char bar[102]; memset(bar,'