【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;
  }

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值