Linux下第一个程序:进度条

2023-03-31 09:15:46 浏览数 (1)

一、前言

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

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


二、知识点

1.回车和换行

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

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

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

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

2.缓冲区概念

我们看下面这段代码

代码语言:javascript复制
int main()
{
    printf("hello worldn");
    sleep(3);
}
代码语言:javascript复制
int main()
{
    printf("hello worldr");
    sleep(3);
}

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

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

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

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

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

3.制造动态转圈效果

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

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

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


四、效果展示

进度条


五、代码

makefile

代码语言:javascript复制
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

代码语言:javascript复制
#include <stdio.h>
#include <string.h>
#include <unistd.h>
define MAX 101
#define S_NUM 5
                                                                                                                                                                   
extern void MyProc();

myproc.c

代码语言:javascript复制
#include "myproc.h"    
      
char style[S_NUM] = {'#','-','.',' ','>'};    
      
void MyProc()    
  {    
      char arr[MAX];    
      memset(arr,'',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

代码语言:javascript复制
#include "myproc.h"

int main()
{
     MyProc();                                                                                                                                                                 
     return 0;
}

0 人点赞