赞
踩
最近学习了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;
- }

Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。