【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♪(・ω・)ノ

相关推荐
我科绝伦(Huanhuan Zhou)10 小时前
Linux 环境下 SQL Server 自动收缩日志作业创建脚本(Shell 版)
linux·运维·数据库·sql server
刘孬孬沉迷学习10 小时前
GTP协议
开发语言·学习·5g·php·信息与通信
不夜牛仔10 小时前
算法笔记19 - 图和通用结构 | 图的两种遍历 | 三种拓扑排序 | 两种最小生成树算法Kruskal, Prim | 最短路径算法Dijkstra
笔记·算法
徐徐图之!10 小时前
五、【阶段一运维基础 之 干货!!!】安装 Vmware 和 CentOS
linux·运维·centos
炽烈小老头10 小时前
【每天学习一点算法2025/12/16】二叉树的最大深度
学习·算法
Felven10 小时前
华为昇腾310P模型转换失败问题解决
linux·python·模型训练·昇腾·310p
水瓶_bxt10 小时前
在 Linux 系统中安装新字体
linux·运维·服务器
白云千载尽10 小时前
基础命令学习之ps 与 pkill 与 nohup 与 2>&1 &
服务器·学习·远程
春日见10 小时前
虚拟机vmware linux的piix4_smbus : SMBus Host Controller not enabled
linux·运维·服务器
AttaGain10 小时前
Ubuntu24中ISO文件制作工具
linux·ubuntu