如何在Linux下打印出进度条
一、引言
本篇文章,让我们一起学习一下如何在linux系统下完成进度条的打印。
二、了解回车符、换行符和刷新缓冲区
:表示回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖(光标在该行的头部) 或 :表示换行,换到当前位置的下一行(光标在下一行的头部)
#include <stdio.h> 2 3 int main(){ 4 5 printf("hello world "); 6 return 0; 7 8 }
[wmh@VM-24-5-centos ]$ vim test.c [wmh@VM-24-5-centos ]$ gcc test.c [wmh@VM-24-5-centos ]$ ./a.out hello world [wmh@VM-24-5-centos ]$
上述代码我们使用vim创建了一个.c文件,当在打印行末尾输入“ ”或“ ”的时候,光标会先到hello world行首,再往下换行,显示出以上界面
[wmh@VM-24-5-centos ]$ gcc test.c [wmh@VM-24-5-centos ]$ ./a.out
当我们修改代码,去掉“ ”的时候,我们再次编译运行可以发现,没有打印结果,当打印到“ ”的时候,光标会回到行首,并覆盖之前的内容,导致没有打印结果,但是hello world仍在缓冲区,并没有被删除,只是没在页面上显示出来。
缓冲区有自己的刷新策略(这里是行缓冲),当遇见有“ ”的时候,缓冲区会把 及其之前的所有内容刷新出来。这是之前能打印出来的原因。
通过上述代码以及文字解释,相信大家也有了简单的认识,当只存在“ ”的时候,打印数据会被覆盖,而没有打印到屏幕,既然缓冲区里还有,那我们可以通过手动刷新缓冲区,取出他的打印结果。
1 #include <stdio.h> 2 #include <unistd.h> 3 int main(){ 4 5 printf("hello world "); 6 fflush(stdout); //刷新缓冲区,stdout姑且认为是屏幕 7 sleep(1); //间隔时间1s 8 printf(" ); 9 return 0; 10 11 }
[wmh@VM-24-5-centos ]$ gcc test.c [wmh@VM-24-5-centos ]$ ./a.out hello world [wmh@VM-24-5-centos ]$
再次运行可以看到显示结果打印到了屏幕上。
三、打印进度条
铺垫了这么久,接下来我们看一下进度条的实现 核心思想也是利用“ ”和缓冲区,实现不断的覆盖打印
#include <string.h> #include "progress.h" #include <unistd.h> //进度条大小 #define SIZE 102 //进度条样式 #define STYLE = //进度条指示器 #define S > void show(){ const char* tmp="|/-\";//是否处于加载中 char arr[SIZE]; memset(arr,0,sizeof(arr)); int i=0; while(i<=100){ //printf("[%-100s]][%d%%][%c] ",arr,i,tmp[i%4]);简单版 //设置进度条样式,添加背景色,字体颜色等 printf("[ 33[43;31;1m%-100s 33[0m]][%d%%][%c] ",arr,i,tmp[i%4]); fflush(stdout); arr[i++]=STYLE; if(i != 100) arr[i]=S; usleep(100000);//100000微秒 } printf(" "); }
演示效果: 运行上述代码应是一个动态的进度条,这里我只截了一张图