【Linux】 第一个系统程序——进度条

文章目录

一、预备知识

1.1 什么是回车换行

    在计算机中,我们用符号\n表示换行,用\r表示回车。用\r\n整体表示回车换行。一般意义上的回车换行是两个独立的独立的动作,但是C语言中的\n同时完成了回车和换行的工作。

    回车换行对应到我们键盘上的按键就是:

1.2 关于缓冲区

我们先来看一个简单的程序。

我们肯定能想到程序运行过程,先是打印出hello world,然后休眠3秒,程序退出。

如果我们把上面printf函数中的\n去掉呢?

那这个程序的现象是什么呢?还是先是打印出hello world,然后休眠3秒,程序退出吗?我们来看一下想象:

   大家可以看到是先休眠三秒,在打印出hello world,最后程序退出。按理来说,程序自上往下按顺序执行代码,也就是说一定是把printf执行完了,再去执行sleep,那printf执行完了,显示器并没有显示出来,那么在休眠3秒期间,"hello world"在哪里?答案是在缓冲区里面,printf函数底层是把格式化的数据写入到stdout缓冲区,然后stdout缓冲区刷新,就会被将数据写入到内核空间,最终硬件输出到屏幕。

   如果printf函数里面有\n,执行完该语句会对缓冲区进行刷新,刷新后我们就能看到,如果没有刷新,就会呆在缓冲区里面。那为什么最后又打印出来了呢?原因是程序结束后,会自动刷新缓冲区。

   如果想让不带\n的字符串立马刷新,可以用fflush函数对缓冲区刷新。


可以看到立马打印出了hello world。

二、简易的倒计时

因为\r不能刷新缓冲区,只起到回车的作用,所以要用fflush函数刷新缓冲区。%-2d是让打印出的数字的宽度为2,左对齐。最后程序结束前还要打印\n,是因为最后想保留数字0,否则就会被覆盖掉。

三、进度条

3.1 version1 原理版本

我们想写的进度条是什么样的?

具体实现过程:

  1. 首先要创建三个文件process.h头文件,用于对进度条函数的声明,以及包含函数实现所需的头文件。process.c源文件,在里面定义进度条函数的实现。main.c源文件,用于调用进度条函数。
  2. 定义自动化构建工具------makefile文件

    定义完后,使用make命令,就能自动生成processbar可执行程序
  3. process.c源文件里写具体实现代码:

3.1.1实现原理:

进度条往右走的实现原理:

    进度条向右走动的原理就是,这一次比上一次多打印一点内容。因此我们可以定义一个字符数组 buff,通过循环每次往字符数组里面追加字符,然后将这个字符数组打印出来,由于每次循环都会往数组里追加字符,所以就会导致下一次打印出来的内容比这一次的多,视觉上就感觉进度条在往右走。又因为进度条始终是在同一行往右走的,所以每打印完一次要用\r,是为了让光标回到当前行的最开始位置,下一次打印就会产生覆盖的效果,紧接着要对 stdout缓冲区刷新,我们才能看到字符显示出来。
字符数组 buff的长度应该是多大?

   因为在进度条后紧跟的是实时进度百分比,即printf函数中的[%d%%]第一个 % 标记 "后续是格式指令",第二个 % 表示 "指令内容就是输出 %",这是格式指令的特殊写法 ,进度是从0%到100%,所以每追加一个字符,进度就增加1%,因此总共需要100个字符,以字符串的形式输出,需要确保buff数组的最后一个元素是\0。为了让 buff数组的能容纳这个100长度的字符串,还需要额外 1 个字节存储字符串终止符\0。所以buff数组长度应该是101 。在定义buff数组后,需要将buff 数组的所有字节初始化为 0(即 \0),确保在打印字符串时,buff数组中都有\0在,否则会出现乱码的想象。
旋转图标的原理:

   就是定义一个label数组,存储'|','\','-','/',通过数组下标循环表示。

3.2 version2 真实版本

   现实中的进度条,往往出现在下载一个东西的时候,用进度条来显示下载的进度。但是进度条本身并不知道下载了多少,它只会提供一个接口,在下载东西的时候,调用这个接口,然后将已经下载好的比率作为参数传给进度条函数,它会根据比率打印出对应的进度条进度。

main.c源文件:

process.h:
process.h:

预览效果:

🏆结语:

    今天的分享就到这里,感谢各位大佬的关注,还请大家多多支持哦!

相关推荐
Lonely 净土6 小时前
Linux 运维文件写入操作
linux·运维·服务器·文件管理
城管不管6 小时前
重生——第十一次面试之挖财一面2026.8.19已OC
java·服务器·jvm·数据库·spring·面试·职场和发展
飞英思特无线充电7 小时前
严苛场景巡检机器人的无线补能设计:点位、BMS、认证与运维边界
运维·机器人
Jimmy_jimi7 小时前
利用nginx代理完成url重定位
运维·nginx
liuyicenysabel8 小时前
多服务上线日记三:
运维·服务器·笔记·学习
吠品9 小时前
Wine 在 Linux 上运行 Windows 软件完整指南
java·linux·服务器
一只鹿鹿鹿9 小时前
大数据中心安全系统解决方案(Word文件)
大数据·运维·物联网·安全·政务
深念Y11 小时前
从 Windows 迁移到 Linux 开发环境的记录
linux·windows·链接·bun·ram·imdisk
AuTumn-L11 小时前
使用 SSH 密钥认证实现安全免密登录
服务器·安全·ssh
领创工作室11 小时前
GitHub Workflows 全面解析:从核心概念到开源实现
运维·github