Linux首战之进度条

有句标题很好------实践是检验真理的唯一标准,手上有了vim,gcc/g++和make/makefile工具以后,让我们利用它们来完成首个linux项目------进度条。

一.知识补充

1.回车换行的细解

按一下回车键,其实是执行回车和换行两个动作 ,换行是将光标定位到下一行的同一位置,而回车是回到一行的开头。

举个作文格的例子:

在计算机语言中,换行符是\n,回车符是\r。而用组合技\r\n来实现回车换行操作。但是为什么c/c++写一个\n就能实现回车换行呢?答案是在编译解析的时候就自动把\n变成了\r\n。

2.粗略见识缓冲区与一个反直觉的现象

我们暂且将缓冲区当成一段内存块。

反直觉现象

这段代码在打印那里去除了"\n"以后,执行顺序是先打印再休眠,但执行结果看似却变成了先休眠再打印。这是为什么呢?

事实上执行结果也依然是先打印再休眠,只是3s休眠之前,应该打印出来的hello_world被存进了缓冲区里 ,那么在3s休眠之后,它为什么又被从缓冲区里放出来了呢?答案在于休眠完以后,程序结束,自动进行行刷新,将缓冲区里的东西刷新出来。综上出现了先休眠再打印的错觉。

错觉产生的示意图:

那为什么在打印字符串后增加"\n"就可以实现执行结果看起来还是先打印再休眠呢?

\n会先行刷新再换行 ,也就是说打印执行完以后,会对该行进行刷新,将缓冲区里的字符串刷新出来,换行,然后再进行休眠。

fflush

那么如何在没有"\n"的情况下,也能做到立马刷新出hello_world呢?

这里在printf的下一行输入一个代码------fflush(stdout),该指令用于强制刷新。

二.实践

1.小试牛刀------倒计时

我们想要数字始终在原位而非换行,就需要用到\r,让光标回到首字符,然后让下一个数字把上一个覆盖掉,但\r没有缓冲区刷新的功能,因而要在打印语句下面增加fflush(out)。

代码:

2.进度条

样式图和要求:

原理版制作过程:

1.首先创建项目目录,并打开:
2.该目录下创建文件:processbar.h,processbar.c,main.c
3.初步编辑makefile
4.编写processbar.c里"#"增加和百分比的部分

①.由于#每循环一次,增加一个,就可以用到上面的\r和fflush将每次的#打出来,然后每次覆盖掉上一次的,就能在视觉上呈现"#"增加。

②.在字符串左边预留100个字符,即100s,这就能保证从右往左打#,即右对齐,从而让进度条右边不移动。

但我们要的是从左往右打啊,没关系,在100前加一个"-"就行了,"-"代表左对齐。

③.那么如何设置百分比呢?简单啊,printf里新增一个元素就行了。

代码:

输出结果:

简直完美!

5.processbar.c可转动光标的实现
①.原理

依旧用到printf,\r和fflush(stdout)在同一位置不断显示刷新覆盖"|/-\|"。

②.实现

用一个字符串lable装"|/-\\",然后求lable长度len,打印时用cnt模len,作为lable的下标,这就能使得下标不会越界。

代码:

实现:

由此,第一代进度条完成。

但这样的进度条是没法用的,它并不是根据真实的下载进度去跑的,所以我们接下来要去实现一个能用的进度条。

改进版代码:

main.c:
processbar.c:

由于函数一直被调用,所以运用这个特点去创建一个static计数器cnt,每调用一次就++一次,同时让cnt%len,让其不越界,随后让其作为lable下标,就能保证光标不停旋转。

相关推荐
为思念酝酿的痛1 小时前
Socket编程--TCP
服务器·网络·tcp/ip
智能运维指南1 小时前
智能体自治运维选型指南:2026年企业如何从“AI辅助”走向“AI自治”
大数据·运维·人工智能
suijishengchengde1 小时前
k8s deployment或statefulset分组关停
运维·kubernetes
翼龙云_cloud1 小时前
腾讯云国际代理商:CDB数据库自动备份和异地灾备配置 从快照到跨区域恢复
运维·数据库·云计算·腾讯云
日常筹谋记2 小时前
西门子 G120XA 变频器在数据中心冷却水泵系统的应用与数字化运维价值
运维
北城笑笑2 小时前
Server 18 ,Nginx + Vite 前端部署排错实战:从 `/api/gpt/chat` 404 到 9012 后端服务的完整定位过程
linux·运维·前端·nginx·ubuntu·vue
Elastic 中国社区官方博客2 小时前
Elasticsearch:什么是向量数据库?
大数据·运维·数据库·人工智能·elasticsearch·搜索引擎·ai
江湖有缘2 小时前
从零搭建私有云相册:使用 Docker 一键部署 Damselfly全攻略
运维·docker·容器
NJCloud2 小时前
ELK企业级日志分析平台(四)——基于 ELFK + Kafka 的日志采集与传输平台部署实践
linux·运维·分布式·elk·kafka