【Linux】倒计时和进度条完成

news/2025/10/24 11:45:27/文章来源:https://www.cnblogs.com/yxysuanfa/p/19162844

目录

  • 前言
  • 一、知识铺垫
    • 1. 回车换行
    • 2. 缓冲区
  • 二、倒计时小程序
  • 三、进度条小程序
    • 1. 进度条理论代码
    • 2. 进度条实战版本

前言

【Linux】自动化构建–make/Makefile详情请点击,今天继续介绍【Linux】倒计时小程序和进度条程序

一、知识铺垫

1. 回车换行

回车代表的意思是让光标回到当前行的起始位置,换行是换到下一行的意思

2. 缓冲区

  1. 我们在test.c中写入下面代码,sleep(2):休眠2秒,sleep头文件是#include< unistd.h >
    在这里插入图片描述
  2. 使用gcc编译链接再运行,发现开始的时候没有显示"hello world",等待2s后再显示屏上打印"hello world",按照我们正常C语言逻辑我们可以知道,程序是从上到下一条条执行的,按照正常逻辑应该先执行"hello world",在sleep 2s,然后程序结束,为什么会是我们看到的那样呢?
  3. 程序后面能打印出"hello world"说明字符串并没有丢失,而是先被保存起来了,这个保存的位置叫做缓冲区,当程序遇到"\n"或者程序结束时会将缓冲区的内容在显示屏显示出来,由于printf函数后面没有"\n",所以该语句暂时保存在缓冲区,sleep 2s后程序结束输出到显示屏上
  4. 当在"hello world"语句后面加入"\n"后,先在显示屏输出"hello world",再sleep 2s,程序结束
    在这里插入图片描述
  5. 如果在不加"\n"的情况下,如何让程序立刻输出"hello world",再sleep 2s,程序结束?
  • 可以使用fflush函数强制刷新缓冲区内容,fflush需要传对应的流,流分为:标准输入流(stdin)、标准输出流(stdout)、标准错误流
  • “hello world"是要输出到显示屏上,因此传入标准输出流,使用fflush后先输出"hello world”,再sleep 2s后程序结束,且没有换行
    在这里插入图片描述
    在这里插入图片描述

二、倒计时小程序

  1. 我们默认生成10s倒计时
  2. 使用while循环来打印的倒计时数字并设置sleep,这样才能看到倒计时效果,注意这里需要使用fflush函数强制刷新缓冲区内容到显示屏上
  3. 数字是以字符显示到显示屏上的,数字10在显示屏打印出来时是字符1和字符0打印到显示屏上,当倒计时数字是9时,是一个字符,那么0那个字符并不会被覆盖,因此我们要使用%-2d让数字打印占两个字符,且左对齐打印
  4. 最后倒计时完毕后加入换行符,防止倒计时的0被命令行覆盖
#include<stdio.h>#include<unistd.h>int main(){int cnt = 10;while(cnt >= 0){printf("%-2d\r", cnt);fflush(stdout);sleep(1);cnt--;}printf("\n");return 0;}

三、进度条小程序

进度条样例
在这里插入图片描述

1. 进度条理论代码

  1. 我们创建processBar.c文件编写进度条代码的实现,main.c文件编写进度条函数和基本的框架,processBar.h声明进度条函数。同时使用make/makefile自动化构建
  2. processBar.h中,为了防止头文件被重复包含,使用#pragma once,同时声明进度条函数void Process()
  3. 包含头文件#include<string.h>和#include<unistd.h>,在初始化processbuff时使用memset需要string头文件,使用usleep时需要unistd头文件
#pragma once
#include <stdio.h>#include<string.h>#include<unistd.h>   void Process();
  1. processBar.c中,包含#include<processBar.h>,宏定义数组大小和加载符号
  2. 根据上面进度条实例,我们需要打印processbuff、进度百分比和加载符,同时要使用fflush函数强制缓冲区刷新,实时将进度更新到显示屏上,再useep(50000)
  3. 最后进度条更新到100%后换行,防止命令行覆盖进度条
#include"processBar.h"
#define SIZE 101
#define STYLE '='
void Process()
{
const char* label = "|/-\\";
int len = strlen(label);
char processbuff[101];
memset(processbuff, '\0', SIZE);
int cnt = 0;
while(cnt <= 100)
{
printf("[%-100s][%d%%][%c]\r", processbuff, cnt, label[cnt%len]);
fflush(stdout);
processbuff[cnt++] = STYLE;
usleep(50000);
}
printf("\n");
}
  1. main.c中,也需要包含#include<processBar.h>,直接调用Process函数
#include"processBar.h"
int main()
{
Process();
return 0;
}

2. 进度条实战版本

生活中,进度条往往运用在软件下载过程中,由于网速和软件包大小不同软件下载时间也是不同的,进度条速度也在实时变化

  1. processBar.h中,为了防止头文件被重复包含,使用#pragma once,同时声明进度条函数void FlashProcess(double total,double cur)
  2. 包含头文件#include<string.h>和#include<unistd.h>,在初始化processbuff时使用memset需要string头文件,使用usleep时需要unistd头文件,使用#include<time.h>和#include<stdlib.h>生成随机数来模拟下载网速波动
#pragma once
#include <stdio.h>#include<string.h>#include<unistd.h>#include<time.h>#include<stdlib.h>  void FlashProcess(double total,double cur); // 更新进度,按照实时下载进度更新进度条
  1. processBar.c中,包含#include<processBar.h>,宏定义数组大小和加载符号
  2. 对于进度条进度‘=’的更新问题,由于等号不可能出现0.13等小数个等号,所以取整
  3. 对于进度条的旋转光标的实现,在正常下如果下载较慢(进度条不更新,rate也没有更新),怎么判断是否还在下载,还是说只是下载较慢,暂时没有更新。通过旋转光标是否转动来判断,所以旋转光标的转换不能和total和cur挂钩,而是和调用FlashProcess函数的次数来更新,只要还在调用该函数说明还在下载中
  4. 再将进度条实时刷新到显示屏上,而不是等函数调用完成之后自动刷新到显示屏上,所以使用fflush(stdout);
  5. 当进度条到达100%之后,还需要换行,避免命令行覆盖进度条
1 #include"processBar.h"
2
3
4 #define SIZE 101
5 #define STYLE '='
8 void FlashProcess(double total,double cur)
9 {
10     if(cur > total)
11         cur = total;
12     double rate = cur / total * 100; //转化为0.1->10%这样的形式
13     int cnt = (int) rate;// 10.4->10
14     char processbuff[SIZE];
15     memset(processbuff, '\0', SIZE);
16     int i = 0;
17     for(; i < cnt; i++)
18     {
19         processbuff[i] = STYLE;
20     }
21     static const char* label = "|/-\\";
22     static int index = 0;
23     printf("[%-100s][%.lf%%][%c]\r",processbuff, rate, label[index++]);
24     index %= strlen(label);
25     fflush(stdout);
26     if(cur >= total)
27         printf("\n");
28 }
  1. main.c中,也需要包含#include<processBar.h>,需要一个下载函数,当cur > total时,将cur = total,再刷新到显示屏上跳出循环
  2. 模拟实现网速波动使用函数SpeedFloat,限制网速波动范围
1 #include"processBar.h"
5 double SpeedFloat(double start, double range)
6 {
7     int int_range = (int)range;
8     return start + rand() % int_range + (range - int_range);
9
10 }
11 void Download(double total)
12 {
13     srand(time(NULL));
14     double cur = 0.0;
15     while(1)
16     {
17         if(cur > total)
18         {
19             cur = total;
20             FlashProcess(total, cur);
21             break;
22         }
23         FlashProcess(total, cur); // 更新进度,按照实时下载进度更新进度条
25         cur += SpeedFloat(speed, 20.3);
26         usleep(30000);
27     }
28 }
30 int main()
31 {
32     printf("Download:20.0MB\n");
33     Download(20.0);
34     printf("Download:200.0MB\n");
35     Download(200.0);
36     printf("Download:2000.0MB\n");
37     Download(2000.0);
38     printf("Download:20000.0MB\n");
39     Download(20000.0);
40     return 0;
41 }
  1. 我们还可以定义函数指针在调用Download函数的时候直接调用进度条更新函数Download(double total, callback_t cb)
5 //函数指针类型  
6 typedef void (* callback_t)(double, double);
14 //cb:回调函数                 
15 void Download(double total, callback_t cb)
16 {
17     srand(time(NULL));
18     double cur = 0.0;
19     while(1)
20     {
21         if(cur > total)
22         {
23             cur = total;
24             cb(total, cur);
25             break;
26         }
27         cb(total, cur); // 更新进度,按照实时下载进度更新进度条
28        // cur += speed; //模拟下载
29         cur += SpeedFloat(speed, 20.3);
30         usleep(30000);
31     }
32 }
34 int main()
35 {
36     printf("Download:20.0MB\n");
37     Download(20.0, FlashProcess);
38     printf("Download:200.0MB\n");
39     Download(200.0, FlashProcess);
40     printf("Download:2000.0MB\n");
41     Download(2000.0, FlashProcess);
42     printf("Download:20000.0MB\n");
43     Download(20000.0, FlashProcess);
44     return 0;
45 }

运行结果如下:模拟实现了不同网速下的进度条下载过程
在这里插入图片描述

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

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

相关文章

2025年口碑好的FPC离型纸,环氧胶离型纸推荐TOP生产厂家

2025年口碑好的FPC离型纸,环氧胶离型纸推荐TOP生产厂家行业概述FPC离型纸和环氧胶离型纸作为柔性电路板(FPC)制造过程中的关键材料,其质量直接影响最终产品的性能和良率。随着5G、物联网、可穿戴设备等新兴技术的快速…

2025年口碑好的数字地磅,电子汽车衡地磅厂家推荐及选择建议

2025年口碑好的数字地磅,电子汽车衡地磅厂家推荐及选择建议 在工业称重领域,数字地磅和电子汽车衡是关键的计量设备,广泛应用于物流、仓储、制造、矿山等行业。随着技术的进步,市场对高精度、高稳定性、智能化的称…

权威调研榜单:四氟换热器生产厂家TOP3榜单好评深度解析

在化工、制药、电力等工业领域,四氟换热器因其卓越的耐腐蚀性、高导热性和长寿命,成为关键设备之一。随着2025年工业绿色转型加速,四氟换热器市场需求同比增长18%,技术迭代率提升至12%。为帮助行业用户精准选择优质…

2025年口碑好的食品级贴体盒,榴莲贴体盒实力源头

2025年口碑好的食品级贴体盒与榴莲贴体盒实力源头企业推荐指南 随着生鲜电商、高端食品包装需求的爆发式增长,食品级贴体盒因其卓越的保鲜性能、环保属性和定制化设计成为行业焦点。尤其是榴莲等高附加值水果的包装,…

2025年热门的魔方智能柜,黑金刚智能柜厂家推荐及选择指南

2025年热门的魔方智能柜,黑金刚智能柜厂家推荐及选择指南 开篇介绍 随着物联网技术的快速发展,智能柜行业迎来了爆发式增长。2025年,魔方智能柜和黑金刚智能柜因其高效、安全、智能化的特点,成为物流、零售、医疗…

2025年10月进口艺术漆厂家全景解析报告,基于专业测评的技术、性能及市场优势深度分析

进口艺术漆作为高端建筑装饰材料的重要组成部分,以其独特的装饰效果和卓越的环保性能,在住宅、商业空间及公共建筑等领域广受青睐。随着消费者对室内环境健康要求的不断提高,艺术漆在 VOC 含量、耐久性及色彩表现等…

2025 年漆包线厂家最新推荐榜,技术实力与市场口碑深度解析,筛选优质品牌助力采购决策

引言 为帮助采购商精准筛选优质漆包线品牌,中国电器工业协会电线电缆分会联合行业权威测评机构开展 2025 年漆包线品牌测评工作。本次测评采用 “三维九项” 评估体系,从技术实力(研发投入占比、专利数量、定制化能…

2025年诚信的液压水渠成型机,全自动水渠成型机厂家最新权威推荐榜

2025年诚信的液压水渠成型机,全自动水渠成型机厂家最新权威推荐榜在水利工程建设领域,全自动水渠成型机已成为现代化农业灌溉、城市排水和水利工程建设的核心设备。随着2025年国家"十四五"规划对智慧农业和…

2025 年优质销轴厂家最新推荐榜,技术实力与市场口碑深度解析,聚焦高品质连接解决方案发黑 / 异型 / 非标 / 农机销轴公司推荐

引言 为精准筛选销轴领域优质品牌,本次推荐榜联合中国机械工业联合会紧固件分会、全国紧固件标准化技术委员会开展专业测评,测评数据覆盖国内 200 余家销轴生产企业近 3 年产品性能报告。测评体系从技术实力(占比 3…

最大公约数 gcd

最大公约数 gcd 欧几里得算法 速度不如内置函数! 以 \(\mathcal O(\log(a+b))\) 的复杂度求解最大公约数。与内置函数 __gcd 功能基本相同(支持 \(a,b \leq 0\) )。 inline int mygcd(int a, int b) { return b ? …

2025年10月扬州公考面试机构全景解析报告,基于专业测评的技术、性能及市场优势深度分析

在公考竞争日益激烈的背景下,面试环节成为考生脱颖而出的关键。扬州作为江苏省重要城市,公考培训机构众多,但仅有少数机构能凭借专业教研和全面服务赢得市场认可。本文基于对扬州公考面试机构的实地调研和数据统计,…

2025年耐用的陶瓷纤维异性件,硅酸铝纤维陶瓷纤维实力源头加工

2025年耐用的陶瓷纤维异性件,硅酸铝纤维陶瓷纤维实力源头加工 行业概述 在全球能源紧缺与环保政策日益严格的背景下,节能材料的需求持续增长。陶瓷纤维作为一种高效节能材料,广泛应用于机械、冶金、化工、石油、陶…

View root,dirs,files

View root,dirs,files Referring to os src which location of /lib/python3.12 Code: import os For root,dirs,files in os.walk("../tmp2"): print(\n %s %s %s %(root,dirs,files)) results of console:…

2025年正规的按动中性笔,多功能中性笔厂家推荐及采购指南

2025年正规的按动中性笔、多功能中性笔厂家推荐及采购指南 随着办公与学习场景的多样化,按动中性笔和多功能中性笔因其便捷性、流畅书写体验及多功能性,成为市场主流需求。2025年,消费者对笔类产品的品质、功能、设…

2025年口碑好的空气能地暖管,德国品牌地暖管厂家最新TOP推荐榜

2025年口碑好的空气能地暖管,德国品牌地暖管厂家最新TOP推荐榜 随着人们对舒适家居生活的追求不断提升,空气能地暖系统因其节能环保、舒适健康等优势,逐渐成为现代家庭采暖的首选。而地暖管作为地暖系统的核心部件,…

2025 年企业邮箱供应商品牌最新推荐榜,聚焦技术实力与市场口碑深度解析

引言 在数字化办公持续深化的背景下,企业邮箱作为核心沟通枢纽,其性能与安全性直接影响企业运营效率。据中国信息通信研究院 2024 年企业级通信产品测评报告显示,当前市场中仅 62% 的企业邮箱品牌能满足 “99.9% 系…

2025年上海注册公司/上海代理记账公司最新推荐榜,聚焦企业服务品质与特色业务竞争力深度剖析

随着上海市场经济的蓬勃发展,创业者及中小企业对专业财税服务的需求日益增长,从公司注册到日常代理记账、税务筹划,全流程的财税支持成为企业稳健运营的重要保障。然而,当前上海财税咨询市场机构众多,服务质量参差…

2025 年接触角测量仪厂家最新推荐榜:聚焦企业专利技术、品质管控及知名客户合作案例的权威解析

接触角测量仪作为表面科学分析领域的核心设备,以其高精度、高效率的特点,广泛应用于材料科学、生物医药、新能源及半导体等行业。随着对材料表面性能研究需求的不断提升,接触角测量仪在测量精度、数据分析及自动化方…

2025 年国内无缝钢管厂家最新推荐榜:20#/Q355 系列 / 合金管优质品牌权威测评及选购指南

引言 无缝钢管作为能源、化工、机械制造等领域的关键基础材料,2024 年国内市场规模已突破 1200 亿元,年增长率达 8.5%,但产品质量参差不齐、规格混乱等问题仍困扰采购方。为精准筛选优质品牌,本次榜单联合中国钢铁…

2025年诚信的不锈钢网片,304不锈钢网片厂家最新推荐排行榜

2025年诚信的不锈钢网片,304不锈钢网片厂家最新推荐排行榜 开篇介绍 不锈钢网片因其耐腐蚀、高强度、美观耐用等特性,广泛应用于建筑、化工、食品、医疗等多个领域。304不锈钢网片作为最常用的型号,其市场需求持续…