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

相关推荐
微学AI3 小时前
内网穿透的应用-Ubuntu本地Docker部署Leantime项目管理工具随时随地在线管理项目
linux·ubuntu·docker
vvw&3 小时前
如何在 Ubuntu 22.04 上安装 Caddy Web 服务器教程
linux·运维·服务器·前端·ubuntu·web·caddy
likeyou~coucou3 小时前
Linux中SSH服务(二)
linux·运维·ssh
A charmer4 小时前
Linux 进程入门:带你走进操作系统的核心地带(1)
linux·运维·服务器
金增辉4 小时前
Linux 虚拟机与windows主机之间的文件传输--设置共享文件夹方式
linux·运维·服务器
AH_HH5 小时前
如何学习Vue设计模式
vue.js·学习·设计模式
雪碧透心凉_5 小时前
Win32汇编学习笔记09.SEH和反调试
汇编·笔记·学习
XWM_Web6 小时前
JavaAPI.02.包装类与正则表达式
java·开发语言·学习·eclipse
破浪前行·吴6 小时前
【初体验】【学习】Web Component
前端·javascript·css·学习·html
爬楼的猪6 小时前
Ubuntu Bash工具
linux·ubuntu·bash