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

news2024/7/6 20:38:37

文章目录

  • 前言
  • 一、简单写法
    • 1.processbar.h
    • 2. processbar.c
    • 3.main.c
  • 二、使用回调函数
    • 1.processbar.h
    • 2. processbar.c
    • 3.main.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;
  }

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/913749.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Camunda 7.x 系列【24】脚本任务

有道无术,术尚可求,有术无道,止于术。 本系列Spring Boot 版本 2.7.9 本系列Camunda 版本 7.19.0 源码地址:https://gitee.com/pearl-organization/camunda-study-demo 文章目录 1. 概述2. 脚本3. 案例演示3.1 建模3.2 测试1. 概述 Script Task脚本任务是一个自动化的活…

SpringBoot - 两种方式刷新配置信息

一、第一种方式 ​ConfigurationProperties​不能自动刷新&#xff0c;需要手动调用contextRefresher.refresh()方法来刷新配置。 import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component;Component…

pytorch里面的nn.AdaptiveAvgPool2d

今天遇到nn.AdaptiveAvgPool2d((None, 1)) AdaptiveAvgPool2d函数详细解释&#xff1a; 2D自适应平均池化&#xff08;2D adaptive average pooling&#xff09;是一种对输入信号进行二维平均池化的操作&#xff0c;输入信号由多个输入平面&#xff08;input planes&#xff0…

MAC 查看被占用的端口

今天启动一个一个服务的时候&#xff0c;总是报端口被占用的错误&#xff0c;所以就需要找一下是哪个程序占用了端口&#xff0c;查看的命令是&#xff1a; netstat -anp tcp -v | grep 8082那这个命令出来的那个是进程id呢&#xff0c;很显然我画框的就是了&#xff0c;前面的…

「Python|音视频处理|环境准备」如何在Windows系统下安装并配置音视频处理工具FFmpeg

本文主要介绍如何在Windows系统下安装并配置音视频处理工具FFmpeg&#xff0c;方便使用python进行音视频相关的下载或编辑处理。 文章目录 一、下载软件二、解压并配置三、验证安装 一、下载软件 首先要去 ffmpeg官网 下载软件包 由于上面直接下载的按钮是.tar.xz格式的。为了…

IDEA项目实践——VUE介绍与案例分析

系列文章目录 IDEA项目实践——JavaWeb简介以及Servlet编程实战 IDEA项目实践——Spring集成mybatis、spring当中的事务 IDEA项目实践——Spring当中的切面AOP IDEWA项目实践——mybatis的一些基本原理以及案例 IDEA项目实践——Spring框架简介&#xff0c;以及IOC注解 I…

制造业与MES管理系统:一对不可分割的“黄金搭档”

在当今高度竞争的市场环境中&#xff0c;制造业企业面临着越来越多的挑战。为了保持竞争力并实现可持续发展&#xff0c;许多企业已经开始寻求采用先进的技术和系统来提高生产效率和产品质量。在这方面&#xff0c;MES系统&#xff08;制造执行系统&#xff09;已经成为制造业中…

mac常用

一、查看ip地址 ifconfig en0 二、telnet命令 如果报没有telnet命令则安装 brew install telnet 在linux/unix下使用telnet&#xff08;telnet ip 端口号&#xff09;连接主机时提示Escape character is ^]。 1、这个提示的意思是按Ctrl ]会呼出telnet的命令行。 2、telnet…

esp32 micropython oled实时时钟

简介 合宙esp32C3&#xff0c;128*64 I2C oled&#xff0c;硬件i2c,将下面两个py文件放入esp32. ssd1306.py是我优化后的&#xff0c;为了避免错误&#xff0c;使用我提供的ssd1306驱动 只支持128*64的I2C oled 代码 main.py import network import urequests import ujso…

数据结构——布隆计算器

文章目录 1.什么是布隆过滤器&#xff1f;2.布隆过滤器的原理介绍3.布隆过滤器使用场景4.通过 Java 编程手动实现布隆过滤器5.利用Google开源的 Guava中自带的布隆过滤器6.Redis 中的布隆过滤器6.1介绍6.2使用Docker安装6.3常用命令一览6.4实际使用 1.什么是布隆过滤器&#xf…

JavaScript基础(Dom操作)

目录 一&#xff0c;BOM模型1.1&#xff0c;BOM可实现功能 二&#xff0c;Window对象的常用属性2.1&#xff0c;Window对象的常用方法2.1-1&#xff0c;open()和close()方法 三&#xff0c;History对象四&#xff0c;Location对象五&#xff0c;Document对象的常用方法六&#…

配置PPPoE拨号双链路负载分担示例

配置PPPoE拨号双链路负载分担示例 组网需求 如图1所示&#xff0c;设备作为企业出口网关&#xff0c;通过PPPoE拨号双上行接入Internet&#xff0c;链路1和链路2的出口路由采用等价路由进行负载分担。设备上配置NAT实现企业私网用户访问Internet。 图1 设备作为PPPoE Client…

MySQL 实战(一):实现“附近的人”功能

❤️ 个人主页&#xff1a;水滴技术 &#x1f680; 支持水滴&#xff1a;点赞&#x1f44d; 收藏⭐ 留言&#x1f4ac; &#x1f338; 订阅专栏&#xff1a;MySQL 教程&#xff1a;从入门到精通 文章目录 ST_Distance_Sphere 函数示例一&#xff1a;计算北京站到北京西站的距…

Neo4j实现表字段级血缘关系

需求背景 需要在前端页面展示当前表字段的所有上下游血缘关系&#xff0c;以进一步做数据诊断治理。大致效果图如下&#xff1a; 首先这里解释什么是表字段血缘关系&#xff0c;SQL 示例&#xff1a; CREATE TABLE IF NOT EXISTS table_b AS SELECT order_id, order_status F…

分布式数据库架构:高可用、高性能的数据存储

在现代信息时代&#xff0c;数据是企业发展的核心。为了支持海量数据的存储、高并发访问以及保证数据的可靠性&#xff0c;分布式数据库架构应运而生。分布式数据库架构是一种将数据存储在多个物理节点上&#xff0c;并通过一系列复杂的协调和管理机制来提供高可用性和高性能的…

云农场种植:互联网+智慧牧场,为农业注入新的活力和创新

随着科技的不断发展&#xff0c;数字化农业正逐渐成为现代农业的趋势。传统农业面临着土地资源有限、劳动力不足等问题&#xff0c;而云农场种植模式通过数字化技术的运用&#xff0c;互联网养殖着重于“绿色、特色产品和智慧生态”&#xff0c;通过建立“线上养殖线下托养线上…

配置NTP时间服务器

1.配置ntp时间服务器&#xff0c;确保客户端主机能和服务主机同步时间 ​ 客户端主机 同步成功 2.配置ssh免密登陆&#xff0c;能够通过客户端主机通过redhat用户和服务端主机基于公钥验证方式进行远程连接

【严重】Coremail 远程命令执行漏洞

漏洞描述 Coremail是广东盈世计算机科技有限公司推出的一款大型企业邮件系统。 在 Coremail XT5/XT6 版本中&#xff0c;邮件处理功能存在溢出风险&#xff0c;攻击者构造恶意邮件&#xff0c;向任意邮箱地址发送该恶意邮件&#xff0c;当服务器处理邮件时&#xff0c;会触发…

凯迪正大—直流电阻测试仪

一、产品概述 武汉凯迪正大直流电阻测量仪是变压器制造中半成品、成品出厂试验、安装、交接试验及电力部门预防性试验的必测项目&#xff0c;能有效发现变压器线圈的选材、焊接、连接部位松动、缺股、断线等制造缺陷和运行后存在的隐患。 为了满足变压器直流电阻测量的需要&a…

浏览器原生的 画中画 特性

Chrome 116 作为Google浏览器的最新稳定版本已正式发布。Chrome 浏览器支持视频画中画&#xff08;HTMLVideoElement&#xff09;已有一段时间&#xff0c;而 Chrome 116 则新增了文档画中画模式。这种"文档画中画"模式提供了一个始终在顶部的窗口&#xff0c;可以填…