【Linux】实现进度条的两种方式(C语言实现)


前言

回车(\r):让光标回到当前行的最左端
换行(\n):让光标回到下一行的最左端,同时刷新缓冲区

makefile文件的建立以及使用:
在这里插入图片描述

一、简单写法

1.processbar.h

#pragma once                                                                                                                                                   
                                                                                                                                                                
  #include<stdio.h>                                                                                                                            
   #define NUM 102                                                                                                                              
   #define TOP 100                                                                                                                                         
   #define BODY '='                                                                                    
   #define RIGHT '>'                                                                                                                            
                                                                                                                                                                                                                
   extern void processbar(int speed);

2. processbar.c

#include"processbar.h"
   #include<string.h>
   #include<unistd.h>
  const char *lable="|/-\\";
  
   void processbar(int speed){
    
    
     char bar [NUM];
     memset(bar,'\0',sizeof(bar));
     int len=strlen(lable);
   int cnt=0;
    while(cnt<=TOP){
    
    
      printf("[%-100s][%d%%][%c]\r",bar,cnt,lable[cnt%len]);
      //打印的时候在【】内预留100个位置,并且左靠齐打印
      //lable【cnt%len】模拟下载的动态效果
      //并且打印完一次后让光标对齐到最左侧,为下一次覆盖打印做铺垫
     fflush(stdout);
    bar[cnt++]=BODY;
    if(cnt<100){
    
    
      bar[cnt]=RIGHT;
   }
    usleep(speed);
    //进行休眠
   }
    printf("\n");
  }                

3.main.c

 #include"processbar.h"
   #include<unistd.h>
   int main(){
    
    
  processbar(10000);                                                                                                                                                                                            
    return 0;
 }

二、使用回调函数

1.processbar.h

#include<stdio.h>
   #define NUM 102
  #define TOP 100
  #define BODY '='
   #define RIGHT '>'
  extern void processbar(int rate);
   extern void init();    

2. processbar.c

#include"processbar.h"
   #include<string.h>
   #include<unistd.h>
   const char *lable="|/-\\";
   char bar[NUM];
   void processbar(int rate){
    
    
     if(rate<0||rate>100){
    
    
       return ;
     }
    int len=strlen(lable);
    printf("[%-100s][%d%%][%c]\r",bar,rate,lable[rate%len]);
   fflush(stdout);
   bar[rate++]=BODY;
    if(rate<100){
    
    
     bar[rate]=RIGHT;
   }
 
 }
 
  void init(){
    
    
 //重新初始化,清空数组内容
      memset(bar,'\0',sizeof(bar));                                                                                                                                                                             
  }

3.main.c

#include"processbar.h"
   #include<unistd.h>
   typedef void (*callback_t)(int);
   //类型为void (* )(int)的函数指针
   void DownLoad(callback_t   cb){
    
    
   int total=1000;
   int cur=0;
  while(cur<=total){
    
    
     usleep(50000);
    int rate=cur*100/total;
    //算出比例
   cb(rate);
   //每次cur增加都调用一次cb函数
   //也就是processbar函数
   cur+=10;
  }
  printf("\n");
  }
  
 
 int main(){
    
    
    DownLoad(processbar);
    init();
    DownLoad(processbar);                                                                                                                                                                                       
    return 0;
  }

猜你喜欢

转载自blog.csdn.net/m0_74774759/article/details/132432345