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

Linux第一个小程序——进度条

目录

回车和换行

缓冲区

设计倒计时

进度条(多文件操作)

Version1:进度条

Version2:应用场景+进度条

Version3:升级彩色进度条


回车和换行

回车\r:'r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖。

换行\n:'n' 换行,换到当前位置的下一行,而不会回到行首。(满足回车/换行两种功能)

缓冲区

  1 #include<stdio.h>2 #include<unistd.h>//sleep3 int main()4 {5   printf("hello linux,hello word");                                                                          6   sleep(3);7   return 0;8 }
  1 #include<stdio.h>2 #include<unistd.h>//sleep3 int main()4 {5   printf("hello linux,hello word\n");                                                                          6   sleep(3);7   return 0;8 }

屏幕录制 2024-01-27 194734

执行上面两段代码(它们的区别是是否包含\n)

我们清晰的发现:

  • 带有\n的就直接出现在了显示器(屏幕)上
  • 没有带\n的程序结束之后才回显示在终端上

结论:包括\n在内的之前全部字符串全部刷新到我们的显示器上(行刷新)

刷新的方式:

  •  \n
  • 缓冲区满了
  • 程序结束                     
  • 强制刷新fflush   fflush(stdout)
  • 头文件#include<unistd.h> //sleep所需要的头文件包含【Linux系统编程】Linux的系统库中的unistd.h头文件的作用-CSDN博客
  • fflush - C++ Reference (cplusplus.com)
  • stdout - C++ Reference (cplusplus.com)
//输出流--显示器/终端
extern FILE * stdout;
extern FILE * stderr;
//输入流--键盘
extern FILE * stdin;
//开机默认打开三个流(输入/输出流)
  //修改之后1 #include<stdio.h>2 #include<unistd.h>//sleep3 int main()4 {5   printf("hello linux,hello word");6   fflush(stdout);                                                                                            7   sleep(3);                                                                                8   return 0;                                                                                9 } 

为什么是行刷新??缓冲区的存在又是为了什么?立即刷新?

  • 行刷新既考虑到了用户的读取(用户一般是一行一行读取),又考虑到了效率问题。
  • 缓冲区的存在就是为了提高效率。
  • 立即刷星就是我们在终端/显示器从键盘输入文字字符,立即出现在用户面前。
  • 应用思考:Linux上输入密码不显示的原因。 

设计倒计时

  1 #include<stdio.h>2 #include<unistd.h>3 int main()4 {5   int cnt=10;6   while(cnt>=0)7   {8     printf("倒计时:%2d\r",cnt);//2d  9     fflush(stdout);//刷新数据10     cnt--;11     sleep(1);//休眠12   }13   printf("\n");                                                                                              14   return 0;15 }
  • 原理:同一个位置用不同的数字做刷新,所以是动态的变化的 。
  • \r回车,光标回到最开始覆盖前面数据,历史数据在缓冲区已经被fflush刷新到终端上了
  • 2d 是两个字符占位符,我们输入123,输入的是字符1 字符2 字符3 所以10需要两个占位符。
  • 显示器是字符设备。
  • sleep函数引用#include<unistd.h>

最终呈现效果: 

屏幕录制 2024-01-28 122350

进度条(多文件操作)

  • Processbar.h 包含头文件&函数声明
  • Processbar.c函数实现
  • Main.c函数调用/测试
  • Makefile自动化项目构建
  • Makefile里面不需要包含头文件Processbar.h,因为头文件在当前目录下且Processbar.c和Main.c都包含了Processbar.h在自动化构建编译时,回展开头文件,所以不需要!!

 测试一下:

Version1:进度条

#include"Processbar.h"2 //void test()3 //{4 //  printf("this is a test\n");5 //  printf("this is a test\n");6 //  printf("this is a test\n");7 //  printf("this is a test\n");8 //  printf("this is a test\n");9 //  printf("this is a test\n");10 //}     11 #define length 101 //包括\012 #define DataType '#'13 const char*MoveType = "|/-\\";14 void ProcBar()15 {16   char Bar[length];//缓存空间17   memset(Bar,'\0',sizeof(Bar));18   int cnt=0;19   while(cnt<=100)20   {21     printf("[%-100s][%3d%%][%c]\r",Bar,cnt,MoveType[cnt%strlen(MoveType)]);22     fflush(stdout);23     Bar[cnt++]=DataType;24     usleep(20000);//0.02s=20000微秒25   }26   printf("\n");27 }

屏幕录制 2024-01-28 151404

 

注释:

  • memset设置为了遇到\0停止打印,如果不清空全是随机值打印。
  • 单位换算
  • printf一般是右对齐,加上符号-左对齐
  • %% 打印出 %
  • \\ 是反斜杠\的字面常量
  • 占位符100% 3%
  • 取余是为了防止数组越界!!
  • 强制刷新fflush(stdout)
  • 设计\-/\\ 进度条一直在加载/下载,但是因为网速等原因,卡住不动,但是此刻用户又想看到一个进度条在下载的动态效果

Version2:应用场景+进度条

  • 下载文件filesize
  • 当前下载量currentsize
  • 带宽/网速
  • 单位换算1兆=1024*1024字节

Version3:升级彩色进度条

🙂感谢大家的阅读,若有错误和不足,欢迎指正

相关文章:

Linux第一个小程序——进度条

目录 回车和换行 缓冲区 设计倒计时 进度条&#xff08;多文件操作&#xff09; Version1&#xff1a;进度条 Version2&#xff1a;应用场景进度条 Version3&#xff1a;升级彩色进度条 回车和换行 回车\r&#xff1a;r 回车&#xff0c;回到当前行的行首&#xff0c;而…...

(N-141)基于springboot,vue网上拍卖平台

开发工具&#xff1a;IDEA 服务器&#xff1a;Tomcat9.0&#xff0c; jdk1.8 项目构建&#xff1a;maven 数据库&#xff1a;mysql5.7 系统分前后台&#xff0c;项目采用前后端分离 前端技术&#xff1a;vueelementUI 服务端技术&#xff1a;springbootmybatis-plusredi…...

深入了解Figure的结构与层次

深入了解Figure的结构与层次 一 Matplotlib中的Figure1.1 Figure的概念和作用:1.2.创建Figure对象:1.3 Figure的属性和方法: 二 子图&#xff08;Axes&#xff09;的角色与创建2.1 子图&#xff08;Axes&#xff09;的概念&#xff1a;2.2 创建子图的方法&#xff1a;2.3 Axes的…...

c语言基础6

1.逗号表达式 逗号表达式&#xff0c;就是用逗号隔开的多个表达式。 逗号表达式&#xff0c;从左向右依次执行。整个表达式的结果是最后⼀个表达式的结果。 我们来看下面的一个代码&#xff1a; int main() {int a 1;int b 2;int ret (a > b, a b 2, b, b a 1);p…...

kotlin sum 与 sumOf

kotlin 中 sum 的作用&#xff1a; 计算一个列表里面数字的总和&#xff1a; val numbers listOf(1, 2, 3, 4, 5) val sum numbers.sum() println("The sum is: $sum") // 打印结果: The sum is: 15 kotlin中sumOf的作用&#xff1a; 也是计算一个列表里面数字…...

php怎么输入一个变量,http常用的两种请求方式getpost(ctf基础)

php是网页脚本语言&#xff0c;网页一般支持两种提交变量的方式&#xff0c;即get和post get方式传参 直接在网页URL的后面写上【?a1027】&#xff0c;如果有多个参数则用&符号连接&#xff0c; 如【?a10&b27】 post方式传参 需要借助插件&#xff0c;ctfer必备插…...

Spring Boot 项目配置文件

文章目录 配置文件的作用properties基本语法读取文件信息缺点 yml基本语法优点配置不同数据类型字符串类型的写法 配置对象配置集合 读取配置文件的几种方法EnvironmentPropertySource使用原生方式读取 设置不同环境的配置文件 配置文件的作用 整个项目中重要的数据都是在配置…...

学校“数据结构”课程Project—扩展功能(自主设计)

目录 一、设想功能描述 想法缘起 目标功能 二、问题抽象 三、算法设计和优化 1. 易想的朴素搜索 / dp 搜索想法 动态规划&#xff08;dp&#xff09;想法 2. 思考与优化 四、算法实现 五、结果示例 附&#xff1a;使用的地图API 一、设想功能描述 想法缘起 OSM 导出…...

从0开始搭建若依微服务项目 RuoYi-Cloud(保姆式教程 一)

掌握陌生项目解读技巧 掌握若依(RuoYi-Cloud)框架 掌握SpringCloud Alibaba体系项目开发套路&#xff0c;结合我之前所有企业项目来学习就知道有多么简单。 一、框架介绍 1. 简介 一直想做一款后台管理系统&#xff0c;看了很多优秀的开源项目但是发现没有合适的。于是利用空…...

【Chrome】浏览器怎么清除缓存并强制刷新

文章目录 1、正常刷新&#xff1a;正常刷新网页&#xff0c;网页有缓存则采用缓存。 F5 或 刷新键2、强制刷新&#xff1a;忽略缓存刷新&#xff0c;重新下载资源不用缓存。 CtrlF5 或 ShiftF5 或 CtrlShiftR3、在浏览器的设置里面清除所有数据...

Android创建保存Excel文件

Android开发生成保存Excel文件&#xff0c;首先下载两个jar包。下载地址&#xff1a;Android读写Excel文件的两个jar包资源-CSDN文库 poi-3.12-android-a.jar poi-ooxml-schemas-3.12-20150511-a.jar 把jar包放在app的libs文件夹下&#xff0c;引用jar我一般都在build.gradle的…...

Selenium + Django + Echarts 实现亚马逊商品数据可视化爬虫项目

最近完成了1个爬虫项目&#xff0c;记录一下自己的心得。 项目功能简介 根据用户输入商品名称、类别名称&#xff0c;使用Selenium, BS4等技术每天定时抓取亚马逊商品数据&#xff0c;使用Pandas进行数据清洗后保存在MySql数据库中. 使用Django提供用户端功能&#xff0c;显…...

【深度学习】初识深度学习

初识深度学习 什么是深度学习 关系&#xff1a; #mermaid-svg-7QyNQ1BBaD6vmMVi {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-7QyNQ1BBaD6vmMVi .error-icon{fill:#552222;}#mermaid-svg-7QyNQ1BBaD6vmMVi .err…...

探索 Xind3 生态系统,解锁铭文资产的新玩法

铭文市场的兴起&#xff0c;不仅是新资产发行方案向市场的代表&#xff0c;更是新资产革命的代表。通过“公平启动”的方式&#xff0c;任何人都可以按照先到先得的原则“铸造”资产。虽然这看起来是意识形态上的新升级&#xff0c;但实际上最火的铭文风潮是由CEX引发的。 我们…...

js有哪些内置对象?

在 JavaScript 中&#xff0c;内置对象可以分为三类&#xff1a;原始值的包装对象、构造函数和其他对象。这里列举一些常见的内置对象及其方法&#xff1a; 原始值的包装对象&#xff1a; String&#xff1a;字符串类型的包装对象&#xff0c;有 charAt、concat、indexOf、repl…...

拦截器的简单使用

拦截器的简单使用 拦截器的使用创建拦截器preHandle 目标方法执行前执行postHandle 目标方法执行后执行afterCompletion 视图渲染后执行 拦截器使用场景返回值注册拦截器运用拦截器 拦截器的使用 创建拦截器 首先,我们需要创建一个拦截器器的类,并且需要继承自HandlerIntercep…...

【gmsh源码阅读】OCC对象绑定tag及获取几何与网格映射关系

一、Tag是什么&#xff1f; gmsh中的几何模型相对于OCC的模型增加了id编号&#xff0c;也叫tag&#xff0c;在gmsh中可以显示出来。在gmsh中&#xff0c;点、线、面、体都有Tag&#xff0c;以方便对其查找定位查找。在OCC中TopoDS_Shape只有几何与拓扑结构&#xff0c;没有唯一…...

【RTP】webrtc 学习3: webrtc对h264的rtp解包

rtp_rtcp\source\video_rtp_depacketizer_h264.cc【RTP】webrtc 学习2: webrtc对h264的rtp打包 中分析了打包过程的代码,这样再来看解析过程的源码就容易多了:本代码主要基于m79,m98类似。这里注明了jitterbuffer 会再次 做 解析stap-a 变为NAL units解析ParseFuaNalu 第一…...

幻兽帕鲁服务器多少钱?4核16G支持32人在线吗?

4核16G服务器是幻兽帕鲁Palworld推荐的配置&#xff0c;阿里云和腾讯云均推出针对幻兽帕鲁的4核16G服务器&#xff0c;阿里云4核16G幻兽帕鲁专属服务器32元1个月、66元3个月&#xff0c;腾讯云4核16G14M服务器66元1个月、277元3个月、1584元一年。云服务器吧yunfuwuqiba.com分享…...

AD/DA(模数数模转换)

文章目录 前言一、介绍部分介绍AD/DA硬件电路模型硬件电路ADC模块DAC模块ADC0809DAC0832 运算放大器&#xff08;运放&#xff09;运放电路 DA原理两种不同的DA转换器 AD原理部分AD/DA性能指标XPT2046介绍主要功能XPT2046时序结构控制字节解释单端模式配置表 二、实例使用AD读取…...

ThinkPad开机报错0183/0253?别慌,手把手教你搞定EFI变量错误(附BIOS重置教程)

ThinkPad开机报错0183/0253&#xff1f;EFI变量错误全面解决方案当你按下ThinkPad的电源键&#xff0c;期待熟悉的开机画面时&#xff0c;屏幕上却突然跳出一串神秘代码——"0183: Bad CRC of Security Settings in EFI Variable"或"0253: EFI Variable Block D…...

别只拿PotPlayer看片了!挖掘它的采集录制功能,做Switch游戏存档大师

别把PotPlayer当普通播放器&#xff01;解锁它的Switch游戏录制黑科技 你是否已经厌倦了在OBS、Bandicam等专业录制软件中反复调试参数的繁琐&#xff1f;是否想过那个每天用来看视频的PotPlayer&#xff0c;其实隐藏着令人惊喜的游戏录制能力&#xff1f;今天&#xff0c;我们…...

鸿蒙系统微博应用锁常见问题解答

为微博设置应用锁后&#xff0c;不少用户会有各种疑问&#xff1a;忘记密码怎么办&#xff1f;会不会影响消息推送&#xff1f;能不能只锁定某些功能&#xff1f;应用锁耗电吗&#xff1f;本文将针对这些高频问题逐一解答&#xff0c;帮助您更好地使用鸿蒙系统&#xff08;Harm…...

企业云盘签章技术方案:从数字签名原理到工程落地

背景 电子签章在企业云盘中的落地&#xff0c;不只是一个"上传盖章图片"的功能实现。本质上&#xff0c;它是一套涉及数字签名、PKI基础设施、文档完整性校验的综合性技术方案。本文从技术选型角度&#xff0c;说清楚企业云盘内置签章需要解决哪些问题、主流实现方案…...

用图神经网络做缺陷定位,准确率比传统方法高出30%

在现代软件工程的复杂迷宫中&#xff0c;缺陷定位始终是测试团队面临的核心挑战。想象这样一个场景&#xff1a;一个电商系统在特定压力条件下偶发订单丢失&#xff0c;日志中只留下泛泛的超时错误&#xff0c;问题可能深藏在上百个微服务的调用链、分布式事务的竞态条件或某个…...

实战解锁:在Blender中掌握专业级MMD动画制作全流程

实战解锁&#xff1a;在Blender中掌握专业级MMD动画制作全流程 【免费下载链接】blender_mmd_tools MMD Tools is a blender addon for importing/exporting Models and Motions of MikuMikuDance. 项目地址: https://gitcode.com/gh_mirrors/bl/blender_mmd_tools MMD …...

语音AI落地最后一公里卡点,PlayAI质量波动真相:采样率适配缺陷、韵律断层、情感衰减三大隐性陷阱

更多请点击&#xff1a; https://intelliparadigm.com 第一章&#xff1a;PlayAI语音质量评测报告总览 PlayAI语音质量评测体系基于客观指标与主观听感双维度构建&#xff0c;覆盖清晰度、自然度、时延、抗噪性及情感一致性五大核心能力。本报告汇总了在标准测试集&#xff08…...

告别硬编码!在UE5 GAS中实现动态技能键位绑定:从DataAsset配置到运行时热更新的完整流程

告别硬编码&#xff01;在UE5 GAS中实现动态技能键位绑定&#xff1a;从DataAsset配置到运行时热更新的完整流程在当代RPG游戏开发中&#xff0c;技能系统的灵活性和可配置性往往决定了项目的迭代效率。传统硬编码的键位绑定方式不仅增加了程序与策划的沟通成本&#xff0c;更在…...

ESP32屏幕项目救星:用TFT_eSPI库的Touch_calibrate例程,5分钟搞定LittleVGL触摸校准

ESP32屏幕开发实战&#xff1a;5分钟完成LittleVGL触摸校准的高效方法论 当一块全新的ILI9341XPT2046电阻屏摆在你面前时&#xff0c;大多数开发者会迫不及待地跳进LittleVGL的配置深渊。但真正高效的硬件开发者知道&#xff0c;在编写任何图形界面代码之前&#xff0c;有一个关…...

Qri入门教程:如何在5分钟内开始使用分布式数据集版本控制

Qri入门教程&#xff1a;如何在5分钟内开始使用分布式数据集版本控制 【免费下载链接】qri youre invited to a data party! 项目地址: https://gitcode.com/gh_mirrors/qr/qri Qri是一款强大的分布式数据集版本控制工具&#xff0c;它比电子表格更强大&#xff0c;比数…...