Linux实现进度条小程序(包含基础版本和模拟下载过程版本)

Linux实现进度条小程序[包含基础版本和模拟下载过程版本]

  • Linux实现进度条小程序
    • 1.预备的两个小知识
      • 1.缓冲区
        • 1.缓冲区概念的引出
        • 2.缓冲区的概念
      • 2.回车与换行
        • 1.小例子
        • 2.倒计时小程序
    • 2.基础版进度条
      • 1.'='的回车方式的打印
      • 2.百分比的打印
      • 3.状态提示符的打印
    • 3.升级版进度条
      • 1.设计:进度条真实情况
      • 2.模拟下载过程的函数download

Linux实现进度条小程序

1.预备的两个小知识

usleep这个函数的参数是微秒数,作用是让程序休眠对应的微秒数
1秒=1000毫秒
1毫秒=1000微秒
1微妙=1000纳秒
等等等等
因此下面的代码中的
usleep(1000000)=1秒

1.缓冲区

1.缓冲区概念的引出

首先,先让大家看两份代码,分析一下为什么出现这种情况?
在这里插入图片描述
在这里插入图片描述
请注意:这个代码的运行情况是:先打印的hello world,后休眠了1秒
然后我改动了一个地方,把那个’\n’去掉了
在这里插入图片描述
在这里插入图片描述
请注意:
这个代码的运行情况是:先休眠了一秒,然后才打印出hello world
为什么会这样呢?

2.缓冲区的概念

在这里插入图片描述
注意:程序结束时会自动刷新缓冲区,把缓冲区当中的数据打印出来
在这里插入图片描述
在这里插入图片描述
此时我们发现,这个代码的hello world就成功地在休眠之前打印出来了

2.回车与换行

1.小例子

其实,回车和换行是不同的
有什么不同呢

比方说:
你现在是一个高中生,你在上作文课,老师要求大家去写一篇作文
你就在作文纸上面去写,你的笔尖就相当于显示器上的光标
你的作文纸就相当于这个显示器
当你写完一段之后,你的笔尖下移:就像这样
在这里插入图片描述
光标只进行下移这一个操作,这就叫做:换行

但是真正写作文的时候,我们肯定不能只换行,我们一定要再让笔尖(光标)移动到当前行的最开始处然后再去写(这里不纠结新开一个段落要空两个格),就像这样:
在这里插入图片描述
第二个操作我们叫做回车

但是呢,我们的电脑上面的回车键其实完成了两个工作:换行+回车
在我们的旧一些的键盘上回车键就是这么标明的:
在这里插入图片描述
其实我们C语言当中的’\n’也是完成了这两个任务:换行+回车
所以我们在日常生活中几乎不会深究这两个概念的区别

那么C语言中有没有回车呢?
当然有啦:‘\r’
不过请注意: '\r’无法自动刷新缓冲区,因此我们需要用刚才提到的fflush库函数来刷新缓冲区

2.倒计时小程序

其实有了上面那两个概念之后,我们就能够写出一个倒计时小程序来了
那应该怎么写呢?
在这里插入图片描述
于是我们就可以写出这样的代码
在这里插入图片描述
在这里插入图片描述
我期待的是10 -> 9 -> 8 …-> 1 -> 0
结果是: 10 -> 90 -> 80 …-> 10 ->00
为什么会出现这种情况呢?
其实我们的显示器是并不会给我们直接打印10这个数字的
而是先打印字符’1’,然后打印字符’0’
连在一起之后我们就会认为那是10
也就是说我们的这个倒计时的过程其实是这样的
在这里插入图片描述
每次我们覆盖上一个数据只是覆盖了第一个字符’1’而已
第二个字符’0’一直都没有被覆盖
那我们应该怎么办呢?
我们知道printf是可以控制输出格式的

printf("%2d\r",count);
这样就可以把那个'0'也给覆盖掉了

因此我们可以这样改动代码
在这里插入图片描述
在这里插入图片描述
倒计时是成功了,但是它这个数字却总是右对齐的,能不能让它左对齐呢?
当然可以啦
只需要加一个-即可

printf("%-2d\r",count);
这样就可以左对齐了

在这里插入图片描述
在这里插入图片描述
这样我们的倒计时就大功告成了

2.基础版进度条

了解了上面那个倒计时小程序之后,我们先来看一下基础版本的进度条代码该怎么去设计

我们先看一下我完成之后的进度条的样子
在这里插入图片描述
首先我们先来完成那个’=‘和’>‘符号的打印
由我们刚才所写的那个倒计时小程序的启发,我们可以这么来设计
在这里插入图片描述
至于这个’>‘和这个’='我们在代码里面来控制

1.'='的回车方式的打印

因此我们就可以写出这样的代码

#include "Processbar.h"
//VERSION 1
void Process()
{char tmp[NUM]={0};int count=0;while(count<=100){printf("[%-100s]\r",tmp);fflush(stdout);usleep(50000);tmp[count++]=BODY;if(count<100)//这里我们在count++之后再去修改tmp数组的下一个内容,保证这个进度条的'>'符号始终在最前方{tmp[count]=HEAD;}}printf("\n");
}

在这里插入图片描述
这里这个main.c的头文件写错了,应该是#include “Process.h”
在这里插入图片描述
发现成功运行

2.百分比的打印

这个百分比的打印只需要注意一点

printf("[%-100s][%%%d]\r",tmp,count);
这样就可以打印出%数字了

在这里插入图片描述

3.状态提示符的打印

我们这么打印状态提示符
在这里插入图片描述
于是就可以写出这样的代码
在这里插入图片描述

这里我们只需要注意这个不要忘了%4(对4取余)

还有这个’\‘是C语言当中的转义字符,
例如:’\n’就是’n’被转义为了换行符,
我们想要’\‘字符,就需要对这个转义字符再转义一次,就会得到原字符.
而且’\\'这个字符的大小其实是1个字符的大小

然后我们运行一下
在这里插入图片描述
发现成功运行
至此,我们的这个基础版本进度条实现结束
下面我们来看一下升级版本的进度条

3.升级版进度条

1.设计:进度条真实情况

在这里插入图片描述

2.模拟下载过程的函数download

在这里插入图片描述
在这里我们设计了一个模拟下载过程的函数download
我们定义了文件总大小FILE_SIZE,设置了每一次下载的文件的大小one_size,每次下载所需时间50ms(也就是50000微秒),
然后我们就能得出每次下载之后的剩余所需下载大小total,进而也能得到当前下载的进度rate

把所需的头文件包含到Peocessbar.h当中
在这里插入图片描述
然后我们的Processbar.c文件也需要修改
在这里插入图片描述
在Process函数中,这个表示进度的count就可以直接对rate取整了,这样就不用之前那个版本当中的while(count<=100)了,这也就是进度条真实情况的一种模拟

接下来我们再来看一下这个升级版进度条的样子
在这里插入图片描述
其实这两种进度条的样子是一样的,我们所改的是把第一种的while(count<=100)的循环版本改为了真实情况下的进度条的版本

也就是说我们模拟的那个download函数其实省去了process函数当中的usleep函数,并且process函数中的进度改为由download函数提供

这也才是更加让这个进度条代码符合真实情况

以上就是我们的Linux实现进度条小程序(包含基础版本和模拟下载过程版本)的全部内容,希望能对大家有所帮助!

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

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

相关文章

虚拟机Linux-Centos系统网络配置常用命令+Docker 的常用命令

目录 1、虚拟机Linux-Centos系统网络配置常用命令2、Docker 的常用命令2.1 安装docker步骤命令2.2 在docker容器中安装和运行mysql 2、dockerfile关键字区别(ADD/COPY,CMD/ENTRYPOINT) 1、虚拟机Linux-Centos系统网络配置常用命令 进入网络配置文件目录 cd /etc/sysconfig/ne…

【深度学习】Yolov8 区域计数

git&#xff1a;https://github.com/ultralytics/ultralytics/blob/main/examples/YOLOv8-Region-Counter/readme.md 很长时间没有做yolov的项目了&#xff0c;最近一看yolov8有一个区域计数的功能&#xff0c;不得不说很实用啊。 b站&#xff1a;https://www.bilibili.com/vid…

路由器基础(十二):IPSEC VPN配置

一、IPSec VPN基本知识 完整的IPSec协议由加密、摘要、对称密钥交换、安全协议四个部分组成。 两台路由器要建立IPSecVPN连接&#xff0c;就需要保证各自采用加密、摘要、对称密钥 交换、安全协议的参数一致。但是IPSec协议并没有确保这些参数一致的手段。 同时&#xff0c;IP…

【计算机网络】网络层IP协议

文章目录 1. IP协议介绍2. IP报头3. IP的分片和组装4. IP地址网段划分特殊的IP地址子网、局域网、网段的区别IP地址的数量限制 5. 公网IP和私有IP6. NAT技术7. 路由Route 1. IP协议介绍 IP协议&#xff08;Internet Protocol&#xff09;是一种最常用的网络层协议&#xff0c;…

Java —— 类和对象(一)

目录 1. 面向对象的初步认知 1.1 什么是面向对象 1.2 面向对象与面向过程 2. 类定义和使用 2.1 认识类 2.2 类的定义格式 3. 类的实例化(如何产生对象) 3.1 什么是实例化 3.2 访问对象的成员 3.3 类和对象的说明 4. this引用 4.1 为什么要有this引用 4.2 什么是this引用 4.3 th…

从零开始搭建React+TypeScript+webpack开发环境-使用iconfont构建图标库

创建iconfont项目 进入iconfont官网&#xff0c;完成注册流程&#xff0c;即可创建项目。 无法访问iconfont可尝试将电脑dns改为阿里云镜像223.5.5.5和223.6.6.6 添加图标 在图标库里选择图标&#xff0c;加入购物车 将图标添加到之前创建的项目中 生成代码 将代码配置到项目…

【1++的Linux】之线程(一)

&#x1f44d;作者主页&#xff1a;进击的1 &#x1f929; 专栏链接&#xff1a;【1的Linux】 文章目录 一&#xff0c;Linux线程概念二&#xff0c;线程的优缺点进程和线程类比现实 三&#xff0c; 线程的操作线程的私有资源 && 线程的创建线程的等待线程终止线程分离…

chromedp库编写程序

步骤1&#xff1a;首先&#xff0c;我们需要导入chromedp库&#xff0c;以便使用它来下载网页内容。 import chromedp 步骤2&#xff1a;然后&#xff0c;我们需要创建一个函数&#xff0c;该函数接受一个URL作为参数&#xff0c;并使用chromedp库下载该URL的内容。 func do…

关于Vue使用props传值遇到的一些问题

一、The data property “tableData” is already declared as a prop. Use prop default value instead. 翻译过来&#xff1a;数据属性“tableData”已声明为prop。请改prop默认值。 将父组件的prop传过去变量改一下 二、prop传值&#xff0c;子组件比父组件先渲染&#…

LV.12 D17 中断控制器 学习笔记

一、中断控制器 在处理IRQ的时候&#xff0c;会将CPSR写入IRQ_SPSR&#xff0c;然后将CPU切换为IRQ模式&#xff0c;把状态改成ARM状态&#xff0c;把I位写成1禁止全部的IRQ&#xff0c;所以中断这样是我们不想要的。4412是一个四核的CPU&#xff0c;在发送中断前要确定发送给哪…

多测师肖sir_高级金牌讲师_jenkins搭建

jenkins操作手册 一、jenkins介绍 1、持续集成&#xff08;CI&#xff09; Continuous integration 持续集成 团队开发成员每天都有集成他们的工作&#xff0c;通过每个成员每天至少集成一次&#xff0c;也就意味着一天有可 能多次集成。在工作中我们引入持续集成&#xff0c;通…

0基础2小时搭建自己的网站

​作者主页 &#x1f4da;lovewold少个r博客主页 ⚠️本文重点&#xff1a;0基础2小时搭建个人网站 &#x1f449;【C-C入门系列专栏】&#xff1a;博客文章专栏传送门 &#x1f604;每日一言&#xff1a;宁静是一片强大而治愈的神奇海洋&#xff01; 目录 前言 第一步 环境…

Vue-SplitPane可拖拽分隔面板(随意拖动div)

npm install vue-splitpane一、使用 &#xff08;1&#xff09;局部使用&#xff1a; 在vue文件中 import splitPane from vue-splitpane export default {componnets: { splitPane } }&#xff08;2&#xff09;全局使用&#xff1a; 在main.js文件注册 import splitPane…

perl列表创建、追加、删除

简介 perl 列表追加元素 主要是通过push和unshift函数来实现。其中&#xff0c;push是追加到列表尾&#xff0c;unshift是追加到列表头。 perl列表删除元素 主要是通过pop和shift函数来实现。其中&#xff0c;pop是从列表尾删除一个元素&#xff0c; shift是从列表头删除一…

【教3妹学编程-算法题】最大单词长度乘积

3妹&#xff1a;哇&#xff0c;今天好冷啊&#xff0c; 不想上班。 2哥&#xff1a;今天气温比昨天低8度&#xff0c;3妹要空厚一点啊。 3妹 : 嗯&#xff0c; 赶紧把我的羽绒服找出来穿上&#xff01; 2哥&#xff1a;哈哈&#xff0c;那倒还不至于&#xff0c; 不过气温骤降&…

2000-2022年“宽带Z国“试点城市名单匹配数据

2000-2022年“宽带Z国“试点城市名单匹配数据 1、时间&#xff1a;2000-2022年 2、指标&#xff1a;行政区划代码、年份、地区、所属省份、所属地域、试点城市、最早试点年份、DID 3、来源&#xff1a;来自工信部和国家发改委在2014年、2015年和2016年分别遴选的“宽带中国”…

11月起,33个省份纳入数电票开票试点范围内,发票无纸化已是大势所趋!

10月底&#xff0c;北京、贵州、山东&#xff08;不含青岛市&#xff09;、湖南、宁夏5个地区相继发布开展数电票试点工作的通知&#xff0c;至此&#xff0c;全国已有33个省份纳入数电票开票试点范围内。根据上述5地区发布的相关公告&#xff0c;11月1日将正式推行“数电票”开…

python之pyQt5实例:几何绘图界面

使用PyQt5设计一个界面&#xff0c;其中点击不同的按钮可以在画布上画出点、直线、圆和样条曲线 from PyQt5.QtWidgets import QApplication, QMainWindow, QPushButton,QHBoxLayout,QVBoxLayout,QWidget,QLabel from PyQt5.QtGui import QPainter, QPen, QColor from PyQt5.Q…

PyQt5中QLineEdit、QRadioButton、QComboBox这些小部件的change事件

最近在用PyQt5做项目&#xff0c;总结一下QLineEdit、QRadioButton、QComboBox这些部件用到的change事件绑定&#xff0c;即信号与插槽。 QLineEdit QLineEdit 对象是最常用的输入字段。 它提供了一个框&#xff0c;可以在其中输入一行文本。 要输入多行文本&#xff0c;需要…

链式前向星模板

建稠密图可以用邻接矩阵&#xff0c;但稀疏图再用邻接矩阵就很浪费空间了&#xff0c;有可能会爆空间复杂度。 可以用邻接表来实现邻接表建图&#xff0c;两种方法&#xff1a;1.链表 2.链式前向行 只讲第二种&#xff0c;比较常用简洁 链式前向星模板 #define IOS ios::syn…