当前位置:   article > 正文

C语言实现一个进度条小程序_printf模拟打印进度条为什么不是实时的打印

printf模拟打印进度条为什么不是实时的打印

        最近学习了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)


代码

  1. #include<stdio.h>
  2. #include<unistd.h>
  3. #include<string.h>
  4. int main() {
  5. int count = 100;
  6. int i = 0;
  7. char bar[count+1];
  8. const char* rotate = "|/-\\";
  9. memset(bar,'\0',sizeof(bar));
  10. while(i <= count) {
  11. printf("[%-100s][%3d%%][%c]\r",bar,i,rotate[i%4]);
  12. fflush(stdout);
  13. bar[i++]='=';
  14. usleep(50000);
  15. }
  16. return 0;
  17. }

效果

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/IT小白/article/detail/264291
推荐阅读
相关标签
  

闽ICP备14008679号