Linux下第一个程序:进度条

一、前言

进度条程序曾经是百度的一道面试题。

这一期博客我们来介绍代码和原理究竟是怎样的。


二、知识点

1.回车和换行

通常意义上我们以为回车就是就是键盘的那个回车键。

其实不然。回车其实是不换行,回到本行开头。我们通常用符号表示为 \r 

换行就是新起一行,换行则用符号表示为 \n

所以我们通常用的键盘的上的这个键位其实叫做回车换行

2.缓冲区概念

我们看下面这段代码

int main()
{
    printf("hello world\n");
    sleep(3);
}
int main()
{
    printf("hello world\r");
    sleep(3);
}

这两段代码看着就是一个符号不同,结果却天差地别。

先说结果:第一种,是先打印 hello world 然后换行之后休眠3秒。而第二种却是先休眠3秒,再打印hello world 。

这是因为将 hello world 输入到缓冲区之后遇到 \n 马上会刷新缓冲区,然后执行休眠操作。

而第二种代码遇到 \r 不会刷新缓冲区,后面接着执行休眠之后,程序退出的时候刷新缓冲区我们才能看到 hello world 。

而我们制作进度条程序的时候,要用到 \r 符号,但是我们又想要刷新缓冲区,我们可以用到 fflush 函数,可以手动刷新缓冲区

  

3.制造动态转圈效果

当我们进度条卡住的时候,如何让人家知道是不是还在加载呢?

我们可以用四个符号制造一个动态转圈的效果

‘|’  ‘\’  '-'  '/',这四个符号我们只要在同一位置循环打印的时候,就能制造一个转圈的动态效果。 


四、效果展示

进度条


五、代码

makefile

myproc:myproc.c main.c
  2     gcc myproc.c main.c -o myproc -DN=1                                                                                                                                       
  3 .PHONY:clean
  4 clean:
  5     rm -f myproc

myproc.h

#include <stdio.h>
#include <string.h>
#include <unistd.h>
define MAX 101
#define S_NUM 5
                                                                                                                                                                   
extern void MyProc();

myproc.c

#include "myproc.h"    
      
char style[S_NUM] = {'#','-','.','+','>'};    
      
void MyProc()    
  {    
      char arr[MAX];    
      memset(arr,'\0',sizeof(arr));    
      int cnt = 0;    
      
      const char lable[] = {'|','\\','-','/'};    
      
      while(cnt <= 100)    
      {    
          printf("[%s][%-3d%%][%c]\r",arr,cnt,lable[cnt%4]);    
          fflush(stdout);    
          arr[cnt++] = style[N];                                                                                                                                                  
      
          usleep(50000);    
      
      }    
      printf("\n");    
  }    

main.c

#include "myproc.h"

int main()
{
     MyProc();                                                                                                                                                                 
     return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青衫哥

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值