最近学习了Linux的常用命令,还有vim的基本使用,想着在Linux下写个简答的小程序玩玩,顺便熟悉一下vim编辑器的使用。这里写一个进度条的小程序
本来想直接循环输出100个符号,但是还想着加一个可以显示当前加载的进度条百分比的效果,于是想到用while循环,每次重新打印进度条的内容,但是如何做到在同一行重复打印呢?
我查了下资料,发现使用回车符\r可以回到当前行的开始,还发现了换行和回车实际上是两个不同的概念。回车是回到当前行的开始;换行是直接列不变,新起一行(我们的enter键实际上是回车并且换行)
思路
1.首先已定义一个char数组表示进度条,这里我们长度给101,最后一个用来放\0,表示字符串的结束(C语言中需要\0来表示一个字符串的结束),每次循环往数组中添加一个"=",间隔50ms。
2.想着加一个加载中转动的效果,定义一个rotate常量字符串,每次循环的时候依次打印|/-\,注意最后一个\想要输出的话,需要使用转义字符,要再加一个\,为了让其循环输出,我们可以让循环变量i取模4。
3.使用printf语句来控制进度条的输出,%-100s,表示输出字符串的宽度占100个字符,然后后面跟上当前进度的百分比,我们打印i即可,为了使其更加整齐,限定i宽度为3,这样i到100的时候就不会感受到进度条长度变化,最后加上%%(因为%想要输出要使用%%)。最后就是输出一个字符表示rotate了。为了每次都从当前行开始位置输出,printf最后我加上了回车符\r
4.由于printf的字符串会先被保存在C语言级别的缓冲区中,然后显示器遇到\n的时候才会刷新显示到屏幕上。我们这里没有加上换行符\n,所以我们这里需要使用fflush强制刷新缓冲区的内容到显示器上。
5.这里每次刷新内容后,调用usleep休眠50ms,1s = 1000ms,1ms = 1000us,usleep传入数字的单位是us,所以我们这里传入50000表示休眠了50ms,所以这个进度条5s就会结束(也可以用sleep,传入数字的单位是s)
代码
#include<stdio.h>
#include<unistd.h>
#include<string.h>
int main() {
int count = 100;
int i = 0;
char bar[count+1];
const char* rotate = "|/-\\";
memset(bar,'\0',sizeof(bar));
while(i <= count) {
printf("[%-100s][%3d%%][%c]\r",bar,i,rotate[i%4]);
fflush(stdout);
bar[i++]='=';
usleep(50000);
}
return 0;
}
效果