【Linux】进度条

本文中,我们来写一个进度条。

本文大纲:

写一个命令行版的进度条。

1.回车换行

2.缓冲区问题(本文不深究)

​ 2.1测试代码

3.写一个什么样的进度条?

​ version1

​ version2

回车换行

这俩不是一个概念:

在计算机语言中,换行是\n,回车是\r。\n\r是回车换行。

如果改成这样:

我们就会发现,等待3秒后才会打印出来。

那么,先执行的是printf,还是sleep呢?

我们的程序永远都是从前往后执行的。

为什么printf执行完了显示器没有显示?在我们休眠的时间里,我们的字符串在哪?

在缓存区里。

那为什么有’\n’,就能先打印出来呢?

因为行刷新

而我们没有’\n’,是因为程序结束了会自动刷新缓冲区。

如果我们想让不带’\n’的自动刷新呢?

fflush

我们的程序会自动打开这三个流。

stdin是键盘。stdout和stderr是显示器。

我们知道,linux下一切皆文件,printf是往stdout里写入。

所以我们也可以加一个参数,然后写成fprintf版本:

使用fflush:

测试代码:

如果我们想在同一个位置打印呢?那就不能让它换行了。

光标的位置永远是输入下一个字符的位置。

所以我们这样修改:

这里,如果我们把i定义为10,就会发现:

倒计时到1的时候显示的是:

理解显示

当我们在屏幕上打印12345时,打印的是整数12345,还是字符’1’‘2’‘3’‘4’'5’呢?

答案是后者。

**显示器只认字符!**所以我们说,显示器是字符设备

这也是为什么平时printf时,要格式化输出。

比如我们int a;,printf内部把我们的a由整数转成字符串,然后再由类似putc这样的接口把字符一个个显示出来。

我们这样修改:

怎么理解这个%2d呢?

这代表位宽为2,一次显示两个字符,如果只有一个字符,会把后面的字符清理掉,可以理解为显示的是02或者空格2.

我们还可以改成,让数字靠屏幕左侧显示:

这样修改,表示左对齐。

写一个什么样的进度条?

左侧的这个中括号里面,随着右侧中括号里的百分比增加,井号增加(但不会讲右侧中括号向后挤),同时最右侧的中括号中/进行旋转。

原理版本(version1)

用sleep会太慢了,所以我们改用usleep:

微秒

1s=100w微秒

我们可以先写出井号部分的中括号:

然后再写出百分比的中括号:

旋转光标

我们将这4个字符覆盖式地显示:| / - \\,就可以得到我们想要的效果。

\\是因为要取字面值,才能得到我们想要的\

然后我们可以比较巧妙地这样来显示:

这个进度条可以跑了,但是没法使用。

如果未来我们是在下载东西的时候打印进度条:

这样进度条的进度与我们的下载进度不符。

真实版本

应该是边下载边更新。

所以我们接下来把process.h改成:

然后我们再来写process.c

然后会看到报错:

所以我们要这样:

然后我们就可以得到:

然后我们发现没到100,需要改一下这里:

最后修改

我们最后将其改为回调函数形式的,更好:

Thanks♪(・ω・)ノ

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

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

相关文章

SLAM/数字图象处理基础

概念 视差:相同特征的不同深度估计的偏差 BoW,DBoW,DBoW2的区别是什么 Bag of Words (BoW)、DBoW(Dynamic Bag of Words)和DBoW2是用于图像处理和计算机视觉中的不同特征表示和匹配方法。它们之间的主要区别如下&am…

UE5材质节点SimpleGrassWind

SimpleGrassWind节点可以模拟树叶扰动,或小草晃动效果 用来做风格化树、风格化草效果很好 主要节点 前三个节点分别用来控制,风强度,风重力,风速度,WPO是世界位置偏移

WeNet:面向生产的流式和非流式端到端语音识别工具包

这篇文章介绍了WeNet,一个面向生产的开源端到端(E2E)语音识别工具包。WeNet的主要特点和贡献如下: 统一流式和非流式识别:提出了一种名为U2的两阶段框架,能够在单一模型中同时支持流式和非流式语音识别&…

Ubuntu20.04安装Foxit Reader 福昕阅读器

Ubuntu20.04安装Foxit Reader 福昕阅读器 文章目录 Ubuntu20.04安装Foxit Reader 福昕阅读器 先更新一下源 sudo apt update sudo apt upgrade下载Foxit Reader的稳定版本 wget https://cdn01.foxitsoftware.com/pub/foxit/reader/desktop/linux/2.x/2.4/en_us/FoxitReader.e…

2024年底关于期货的工作总结

十几年程序猿出身,因几年前的懵懂无畏闯入期货市场,盈了,感觉期货太简单,飘然裸辞,想当财务自由者,全职做交易。当深入学习时,却亏了,原来市场是让人敬畏的,也是反人性的…

c++入门——c++输入cin和输出cout的简单使用

c输入cin、输出cout 1 cin2 cout3 cin和cout说明 c在c语言的输入、输出函数的基础上进行了封装。 1 cin c可以理解为控制台,in可以理解为输入。 参考代码: void f(){int a;float b;double c;char d;cin>>a>>b>>c>>d;//这里和…

PlantUML 时序图 基本例子

基本的例子 序列-> 用于绘制两个参与者之间的信息。参与者不必明确声明。 要有一个点状的箭头&#xff0c;就用--> 也可以用<- 和<-- 。这不会改变绘图&#xff0c;但可能提高可读性。注意&#xff0c;这只适用于顺序图&#xff0c;其他图的规则不同。 plantum…

YOLOv10-1.1部分代码阅读笔记-utils.py

utils.py ultralytics\nn\modules\utils.py 目录 utils.py 1.所需的库和模块 2.def _get_clones(module, n): 3.def bias_init_with_prob(prior_prob0.01): 4.def linear_init(module): 5.def inverse_sigmoid(x, eps1e-5): 6.def multi_scale_deformable_attn_py…

vue3使用video-player实现视频播放(可拖动视频窗口、调整大小)

1.安装video-player npm install video.js videojs-player/vue --save在main.js中配置全局引入 // 导入视频播放组件 import VueVideoPlayer from videojs-player/vue import video.js/dist/video-js.cssconst app createApp(App) // 视频播放组件 app.use(VueVideoPlayer)2…

基于卷积神经网络的甲状腺结节识别系统,resnet50,mobilenet模型【pytorch框架+python源码】

更多目标检测、图像分类识别、目标追踪等项目可看我主页其他文章 功能演示&#xff1a; 甲状腺结节识别系统&#xff0c;卷积神经网络&#xff0c;resnet50&#xff0c;mobilenet【pytorch框架&#xff0c;python源码】_哔哩哔哩_bilibili &#xff08;一&#xff09;简介 …

C++--类与对象

1.封装 封装是c面向对象的三大特性之一 将属性和行为作为一个整体 将属性和行为加以权限控制 语法&#xff1a; class 类名{ 访问权限: 属性/行为 }; 访问权限 public 公共权限 类内类外均可以访问 protected 保护权限 类内可以访问&#xff0c;类外不可以访问 pr…

区块链期末复习3:跨链原子交换其他加密货币

参考教材&#xff1a;《区块链&#xff1a;技术驱动金融》 一、跨链原子交换&#xff08;不可分割的交叉链互换&#xff09; 1.实施步骤 假设Alice要拿1BTC交换Bob的3BCY。Alice作为交易的发起者。 1&#xff09;Alice创建一个secret&#xff08;一个随机数x), 并计算其哈希…

OCR实践-Table-Transformer

前言 书接上文 OCR实践—PaddleOCR Table-Transformer 与 PubTables-1M table-transformer&#xff0c;来自微软&#xff0c;基于Detr&#xff0c;在PubTables1M 数据集上进行训练&#xff0c;模型是在提出数据集同时的工作&#xff0c; paper PubTables-1M: Towards comp…

重装操作系统后 Oracle 11g 数据库数据还原

场景描述&#xff1a; 由于SSD系统盘损坏&#xff0c;更换硬盘后重装了操作系统&#xff0c;Oracle数据库之前安装在D盘(另一个硬盘)&#xff0c;更换硬盘多添加一个盘符重装系统后盘符从D变成E&#xff0c;也就是之前的D:/app/... 变成了现在的 E:/app/...&#xff0c;重新安装…

gozero项目接入elk的配置与实战

在 **GoZero** 项目中接入 **ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;** 来进行日志管理&#xff0c;是一个非常强大的监控和分析方案。通过集成 ELK&#xff0c;你可以收集、存储、查询和可视化日志数据。 在这里&#xff0c;我将介绍如何在 GoZero 项目中…

探索PIL库:Python图像处理的强大工具

文章一览 前言一、PIL图像处理库简介二、基本概念2.1颜色模型2.1.1 RGB 颜色模型2.1.2 CMY色彩空间 2.2 通道2.3 图像数据2.4 模式 三、用PIL做图像处理3.1 图像缩放、翻转等处理3.1.1 图像缩放处理3.1.2 图像旋转处理&#xff08;1&#xff09;PIL 提供的函数:&#xff08;2&a…

boot工程需求

1、 关闭看门狗、初始化中断和trap向量表&#xff0c;进行时钟和外设初始化&#xff0c;让芯片正常运行起来 2、 提供CAN ETH等用于通讯功能的驱动&#xff0c;能够接受外部数据的传输请求 3、 提供Flash的读写与擦除驱动&#xff0c;设置服务来对通讯端接受到的数据更新代…

C#中的类型和函数参数传递

1.类型 C#中类型分为两类&#xff1a;值类型和引用类型 1.值类型 所有值类型继承自System.ValueType类&#xff08;这是System.Object的一个子类&#xff09; 值类型变量是直接存储数据&#xff0c;值类型变量声明后&#xff0c;不管是否赋值&#xff0c;编译器都会为其分配…

android系统查找应用包名以及主activity:

一、查找应用的主activity&#xff1a; pm list packages 发现所有的包 dumpsys package 包名&#xff1a; 获取所有的包信息&#xff0c;可以所有关键词MAIN来找主activity 也可以通过下面命令找到所有activity&#xff0c;看下面大概率com.android.settings/.Settings为主ac…

微信V3支付报错 平台证书及平台证书序列号

1.平台证书及平台证书序列号设置错误报错&#xff1a; 错误1&#xff1a; Verify the response’s data with: timestamp1735184656, noncea5806b8cabc923299f8db1a174f3a4d0, signatureFZ5FgD/jtt4J99GKssKWKA/0buBSOAbWcu6H52l2UqqaJKvrsNxvodB569ZFz5G3fbassOQcSh5BFq6hvE…