当前位置: 首页 > news >正文

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

在这里插入图片描述

文章目录

  • 一、预备知识
    • 1.1 什么是回车换行
    • 1.2 关于缓冲区
  • 二、简易的倒计时
  • 三、进度条
    • 3.1 version1 原理版本
      • 3.1.1实现原理:
    • 3.2 version2 真实版本
  • 🏆结语:

一、预备知识

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:
在这里插入图片描述
预览效果:
在这里插入图片描述

🏆结语:

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

http://www.dtcms.com/a/536214.html

相关文章:

  • 旅游seo整站优化宁波做网站有哪些公司公司
  • CircleCI 让持续集成变得简单而高效的开源框架
  • Ribbon是如何与服务注册中心nacos交互的
  • 自然语言处理框架:Bert和Transformer
  • (N_157)基于springboot,vue服装商城系统
  • 介绍一下Ribbon
  • 潍坊有哪些网站旅行社网站规划与建设的流程图
  • (项目管理系列课程)项目规划阶段:项目进度管理-估算活动持续时间
  • STM32定时器的输入捕获模式(测量PWM的周期与占空比)
  • 智慧校园数字孪生选型指南:选对平台做好交付,从平台适配到交付落地的全流程解决方案
  • php招生网站开发标准网站建设价格
  • 【NestJS】在 nest.js 项目中,如何使用 Postgresql 来做缓存?
  • 解决由于没有远程桌面授权服务器可以提供许可证,远程会话被中断.的方法
  • 初始化服务器
  • 玉林建设信息网站帮别做网站
  • 【C++ 内存管理、模板初阶与 STL 简介】:打通高效编程的关键链路
  • web开发,在线%高校舆情分析%系统demo,基于python,flaskweb,echart,nlp,ida,tf-idf,多爬虫源,数据库mysql
  • 安装双系统
  • AI研究-113 DeepSeek-OCR 原理与架构全解|视觉压缩长文本 SAM-base 16×下采样 CLIP-L 3B-MoE
  • R语言绘制复杂加权数据(nhanes数据)生存分析决策曲线
  • 常州溧阳建设工程管理中心网站做网站平台的公司
  • 政务领域应用:国密 SSL 证书如何守护 “一网通办” 的数据安全?
  • LM实现教程:基于 nanochat项目 从零开始理解大语言模型
  • 【南京大学主办】第三届数学与机器学习国际学术会议(ICMML 2025)
  • 淮北市建设局网站福建省住房和城乡建设局网站
  • 无锡企业网站龙岩kk网最新招聘
  • 告别纸张,迎接更加高效的文档管理——Paperless-ngx介绍
  • 题解:P14309 【MX-S8-T2】配对
  • SQL之表的增删
  • 【计算机网络核心】TCP/IP模型与网页解析全流程详解