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

【Linux】从0到1实现一个进度条小程序

在这里插入图片描述
在这里插入图片描述

个人主页:🍝在肯德基吃麻辣烫
我的gitee:gitee仓库
分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处


文章目录

  • 前言
  • 一、理解回车 '\r' 和换行 '\n'
  • 二、初步认识缓冲区
    • 1. 认识第一个函数:sleep
    • 2.观察缓冲区出现的现象
    • 3. 认识第二个函数:fflush
  • 三、开始输出进度条
    • 了解倒计时
    • 准备工作
  • 总结

进度条实现:

在这里插入图片描述


前言

本文讲解如何从0到1实现一个进度条小程序。


一、理解回车 ‘\r’ 和换行 ‘\n’

我们在写作文的时候,写到了一行的结尾,就得另起一行并到开头继续写。在这里插入图片描述

其中,这个另起一行的动作就是"换行"
回到开头的动作就是"回车"

  • "回车"这个动作对应的c语言的转义字符是 ‘\r’
  • "换行"这个动作对应的c语言的转义字符是 ‘\n’

但是,\n其实包含了回车和换行两个动作。
我们的键盘上面的回车键也是同时包含回车和换行两个动作。


二、初步认识缓冲区

1. 认识第一个函数:sleep

sleep(1);

sleep函数的功能是让计算机等待指定秒数(单位:秒)后再继续启动。
知道sleep的功能即可。

还有一个睡眠函数:usleep,它们的功能相同,只不过这个函数的单位是微秒

1秒 = 1000毫秒
1毫秒= 1000微秒

2.观察缓冲区出现的现象

来看第一段代码出现的现象:

  2 #include "process.h"3 4 int main()5 {6     printf("Hello Linux\n");7     sleep(2);8 9     return 0;10 }        

现象:

在这里插入图片描述
第二段代码:

  2 #include "process.h"3 4 int main()5 {6     printf("Hello Linux");7     sleep(2);                                                                                                                        8 9     return 0;10 }

现象:

在这里插入图片描述

通过这两段代码以及出现的现象可知:

  • 1.第一段代码是直接弹出 “Hello Linux” 字段后两秒,再弹出指令行。
  • 2.第二段代码是两秒过后,再打印"Hello Linux",并且指令行是紧随其后的。

问:第一个现象是先执行printf函数还是先执行sleep函数?

实际上,c语言是从上往下扫描代码的,所以一定是先执行printf函数。那么,在sleep两秒期间,printf函数去哪了呢?

一定是被保存起来了。

这个保存的东西,就叫做缓冲区

在c语言有一块内存叫做缓冲区

缓冲区是由c语言维护的一块内存空间。

到这里就可以解答第一个现象了,首先执行printf函数,输出Hello Linux,先保存到缓冲区中,2秒后再输出到显示器文件中,由于没有换行,后面则紧跟着指令条。

为什么第二个现象是马上就输出Hello Linux,再睡眠两秒呢?

这是因为'\n'这个换行符,具有刷新缓冲区的功能。

也就是把缓冲区里面的东西给刷掉,让它走它该走的地方,别停留在缓冲区里面了。

至此我们可以解释第二个现象了:Hello Linux字符串其实是先保存到缓冲区中的,然而

遇到'\n'这个换行符刷新后,将该字符串输出到了显示器文件中,再执行2秒休眠,这

才是我们看到的东西。

3. 认识第二个函数:fflush

在c程序中会默认打开三个流:标准输入流,标准输出流,标准错误流。
这里只考虑标准输出流,该流的默认数据是stdout,也就是显示器文件。

fflush函数的功能是:将缓冲区的内容写入到标准输出流。
通俗一点就是将缓冲区的内容打印到屏幕上。

有了这个函数,接下来我们就可以实现进度条小程序了。

三、开始输出进度条

了解倒计时

要实现进度条,首先要知道它每一步要输出什么。
首先讲一讲倒计时,我们见过的倒计时是这样的:
在这里插入图片描述
这里有一个需要注意的地方:

  • 每一个数字都会覆盖上一个数字

就用到开头讲到的'\r'回车符,每次输出数字后,将光标回到当前行开头,再输出,就能将上一个数字覆盖。

具体代码如下:

  2 #include "process.h"3 4 int main()5 {6     int cnt = 9;7     while(cnt)8     {9        printf("%d\r",cnt--);10        fflush(stdout);                                                                                                               11        sleep(1);12     }13     return 0;14 }
~

效果如下:

在这里插入图片描述

准备工作

知道倒计时怎么走后,我们的进度条的过程是类似的:
在这里插入图片描述
输出的过程如上,只是每一次都把数据+1,并输出在当前行,达到一个慢慢增加的效果。(这里为了演示过程,实际上每次输出数据都是输出在同一行)

  • 准备一个buf数组,数组大小为102
    • 将数组的所有元素初始化成'\0',这样每次输入都会遇到'\0'而终止
  • 可以给一个小圆圈光标,const char* lable = "|/-\\",意思是:每增加%1,光标就会变化。(这里有两个"\"是为了将转义字符’‘变成一个单纯的’')
  • 效果如下:
    -
  • 当我们输出进度条时(这个进度条的身体由你来决定),我们应该提前保留100个位置给进度条进行输出。也就是:%s–>%-100s
  • 同理,如开头看到的效果展示,为了输出%(百分号),我们需要两个百分号来输出一个单纯的百分号。

到此,贴出代码,就可以实现进度条啦!

process.h文件

  1                                                                                          2 #include <stdio.h>                                                   3 #include <unistd.h>                                                  4 #include <string.h>                                                                  5                                                                                                                                      6 void process();   

process.c文件

  1  #include"process.h"                                                                                                                 2 #define SIZE 1023 #define BODY '='4 #define HEAD '>'5                 6 char bar[SIZE]; 7 const char* lable = "|\\-/";8                             9 void process()              10 {             11     int cnt = 0;12     memset(bar,'\0',sizeof(bar));13     char c = HEAD;               14     while(cnt<100)               15     {             16         int len = strlen(lable);17         bar[cnt++] = BODY;      18         if(cnt < 100)           19              bar[cnt] = c;20         printf("[%-100s][%d%%][%c]\r",bar,cnt,lable[cnt%len]);21         fflush(stdout);                                       22         usleep(100000);                                       23                        24     }                  25     printf("\n");26 }    

main.c文件

  1 2 #include "process.h"3 4 int main()5 {6     process();                                                                                                                       7     return 0;8 }

一个进度条就新鲜出炉啦!


总结

今天的文章讲了如何在Linux上实现一个进度条小程序,做这个进度条小程序的核心是理解’\r’和’\n’两个转义字符,以及缓冲区的概念,理解之后,实现起来就不难啦。

相关文章:

【Linux】从0到1实现一个进度条小程序

个人主页&#xff1a;&#x1f35d;在肯德基吃麻辣烫 我的gitee&#xff1a;gitee仓库 分享一句喜欢的话&#xff1a;热烈的火焰&#xff0c;冰封在最沉默的火山深处 文章目录 前言一、理解回车 \r 和换行 \n二、初步认识缓冲区1. 认识第一个函数&#xff1a;sleep2.观察缓冲区…...

江南大学轴承数据故障诊断(利用一维CNN进行故障诊断,代码和数据放在压缩包,无需修改任何东西,解压缩后直接运行,有详细注释)

1.江南大学轴承数据集介绍 采样频率&#xff1a;50khz&#xff0c;采样时间&#xff1a;10s 转速&#xff1a;600 800 1000/rpm 内圈&#xff1a;ib 外圈&#xff1a;ob 滚动体&#xff1a;tb 正常&#xff1a;N 以600转速下的内圈故障数据为例展示&#xff1a; 开始数据…...

【网络基础实战之路】基于BGP协议连接三个AS区域的实战详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 【网络基础实战之路】基于…...

基于Python爬虫+词云图+情感分析对某东上完美日记的用户评论分析

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…...

Day 26 C++ list容器(链表)

文章目录 list基本概念定义结构双向迭代器优点缺点List和vector区别存储结构内存管理迭代器稳定性随机访问效率 list构造函数——创建list容器函数原型示例 list 赋值和交换函数原型 list 大小操作函数原型示例 list 插入和删除函数原型示例 list 数据存取函数原型注意示例 lis…...

【深度学习注意力机制系列】—— SKNet注意力机制(附pytorch实现)

SKNet&#xff08;Selective Kernel Network&#xff09;是一种用于图像分类和目标检测任务的深度神经网络架构&#xff0c;其核心创新是引入了选择性的多尺度卷积核&#xff08;Selective Kernel&#xff09;以及一种新颖的注意力机制&#xff0c;从而在不增加网络复杂性的情况…...

Markdown语法和表情

Markdown语法和表情 1. 标题2. 段落3. 加粗和斜体4.分隔线5.删除线6.下划线7.引用8.列表9.链接10. 图片11. 代码12.Markdown 表格其他1.支持的 HTML 元素2.转义3.公式 Markdown表情参考 Markdown 是一种轻量级的标记语言&#xff0c;用于简洁地编写文本并转换为HTML。它的语法简…...

CSDN编纂目录索引跳转设置

CSDN编纂目录索引跳转设置 文章目录 题目第一小节第二小节第三小节结论 题目 第一小节 第二小节 第三小节 结论...

cpu的架构

明天继续搞一下cache,还有后面的, 下面是cpu框架图 开始解释cpu 1.控制器 控制器又称为控制单元&#xff08;Control Unit&#xff0c;简称CU&#xff09;,下面是控制器的组成 1.指令寄存器IR:是用来存放当前正在执行的的一条指令。当一条指令需要被执行时&#xff0c;先按…...

FastAPI和Flask:构建RESTful API的比较分析

Python 是一种功能强大的编程语言&#xff0c;广泛应用于 Web 开发领域。FastAPI 和 Flask 是 Python Web 开发中最受欢迎的两个框架。本文将对 FastAPI 和 Flask 进行综合对比&#xff0c;探讨它们在语法和表达能力、生态系统和社区支持、性能和扩展性、开发工具和调试支持、安…...

用康虎云报表打印二维码

用康虎云报表打印二维码 1 安装: 下载地址: https://www.khcloud.net/cfprint_download, 选择Odoo免代码报表模块和自定义SQL报表模块 下载下来后解压缩,一共有四个模块 cf_report_designer # 报表设计模块 cf_sale_print_ext # 演示模块 cf_sql_report cfprint …...

网盘直链下载助手

一、插件介绍 1.介绍 这是一款免费开源获取网盘文件真实下载地址的油猴脚本&#xff0c;基于 PCSAPI&#xff0c;支持 Windows&#xff0c;Mac&#xff0c;Linux 等多平台&#xff0c;支持 IDM&#xff0c;XDown&#xff0c;Aria2 等多线程下载工具&#xff0c;支持 JSON-RPC…...

【EI复现】售电市场环境下电力用户选择售电公司行为研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…...

并发——何谓悲观锁与乐观锁

乐观锁对应于生活中乐观的人总是想着事情往好的方向发展&#xff0c;悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点&#xff0c;不能不以场景而定说一种人好于另外一种人。 悲观锁 总是假设最坏的情况&#xff0c;每次去拿数据的时候都认为别人会…...

【C++】模板

1.模板的概念 2.函数模板基本语法 3.未完待续。。。 https://www.bilibili.com/video/BV1et411b73Z?p169&spm_id_frompageDriver&vd_sourcefb8dcae0aee3f1aab700c21099045395...

【Echart地图】jQuery+html5基于echarts.js中国地图点击弹出下级城市地图(附完整源码下载)

文章目录 写在前面涉及知识点实现效果1、实现中国地图板块1.1创建dom元素1.2实现地图渲染1.3点击地图进入城市及返回 2、源码分享2.1 百度网盘2.2 123云盘2.3 邮箱留言 总结 写在前面 这篇文章其实我主要是之前留下的一个心结&#xff0c;依稀记得之前做了一个大屏项目的时候&…...

Python AI 绘画

Python AI 绘画 本文我们将为大家介绍如何基于一些开源的库来搭建一套自己的 AI 作图工具。 需要使用的开源库为 Stable Diffusion web UI&#xff0c;它是基于 Gradio 库的 Stable Diffusion 浏览器界面 Stable Diffusion web UI GitHub 地址&#xff1a;GitHub - AUTOMATI…...

mongodb:环境搭建

mongodb 是什么&#xff1f; MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统。没错MongoDB就是数据库&#xff0c;是NoSQL类型的数据库 为什么要用mongodb&#xff1f; &#xff08;1&#xff09;MongoDB提出的是文档、集合的概念&#xff0c;使用BSON&am…...

Grafana技术文档--基本安装-docker安装并挂载数据卷-《十分钟搭建》

阿丹&#xff1a; Prometheus技术文档--基本安装-docker安装并挂载数据卷-《十分钟搭建》_一单成的博客-CSDN博客 在正确安装了Prometheus之后开始使用并安装Grafana作为Prometheus的仪表盘。 一、拉取镜像 搜索可拉取版本 docker search Grafana拉取镜像 docker pull gra…...

【Github】Uptime Kuma:自托管监控工具的完美选择

简介&#xff1a; Uptime Kuma 是一款强大的自托管监控工具&#xff0c;通过简单的部署和配置&#xff0c;可以帮助你监控服务器、VPS 和其他网络服务的在线状态。相比于其他类似工具&#xff0c;Uptime Kuma 提供更多的灵活性和自由度。本文将介绍 Uptime Kuma 的功能、如何使…...

基于距离变化能量开销动态调整的WSN低功耗拓扑控制开销算法matlab仿真

目录 1.程序功能描述 2.测试软件版本以及运行结果展示 3.核心程序 4.算法仿真参数 5.算法理论概述 6.参考文献 7.完整程序 1.程序功能描述 通过动态调整节点通信的能量开销&#xff0c;平衡网络负载&#xff0c;延长WSN生命周期。具体通过建立基于距离的能量消耗模型&am…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院挂号小程序

一、开发准备 ​​环境搭建​​&#xff1a; 安装DevEco Studio 3.0或更高版本配置HarmonyOS SDK申请开发者账号 ​​项目创建​​&#xff1a; File > New > Create Project > Application (选择"Empty Ability") 二、核心功能实现 1. 医院科室展示 /…...

苍穹外卖--缓存菜品

1.问题说明 用户端小程序展示的菜品数据都是通过查询数据库获得&#xff0c;如果用户端访问量比较大&#xff0c;数据库访问压力随之增大 2.实现思路 通过Redis来缓存菜品数据&#xff0c;减少数据库查询操作。 缓存逻辑分析&#xff1a; ①每个分类下的菜品保持一份缓存数据…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成

厌倦手动写WordPress文章&#xff1f;AI自动生成&#xff0c;效率提升10倍&#xff01; 支持多语言、自动配图、定时发布&#xff0c;让内容创作更轻松&#xff01; AI内容生成 → 不想每天写文章&#xff1f;AI一键生成高质量内容&#xff01;多语言支持 → 跨境电商必备&am…...

【Oracle】分区表

个人主页&#xff1a;Guiat 归属专栏&#xff1a;Oracle 文章目录 1. 分区表基础概述1.1 分区表的概念与优势1.2 分区类型概览1.3 分区表的工作原理 2. 范围分区 (RANGE Partitioning)2.1 基础范围分区2.1.1 按日期范围分区2.1.2 按数值范围分区 2.2 间隔分区 (INTERVAL Partit…...

是否存在路径(FIFOBB算法)

题目描述 一个具有 n 个顶点e条边的无向图&#xff0c;该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序&#xff0c;确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数&#xff0c;分别表示n 和 e 的值&#xff08;1…...

基于IDIG-GAN的小样本电机轴承故障诊断

目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) ​梯度归一化(Gradient Normalization)​​ (2) ​判别器梯度间隙正则化(Discriminator Gradient Gap Regularization)​​ (3) ​自注意力机制(Self-Attention)​​ 3. 完整损失函数 二…...

【MATLAB代码】基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),附源代码|订阅专栏后可直接查看

文章所述的代码实现了基于最大相关熵准则(MCC)的三维鲁棒卡尔曼滤波算法(MCC-KF),针对传感器观测数据中存在的脉冲型异常噪声问题,通过非线性加权机制提升滤波器的抗干扰能力。代码通过对比传统KF与MCC-KF在含异常值场景下的表现,验证了后者在状态估计鲁棒性方面的显著优…...

Linux部署私有文件管理系统MinIO

最近需要用到一个文件管理服务&#xff0c;但是又不想花钱&#xff0c;所以就想着自己搭建一个&#xff0c;刚好我们用的一个开源框架已经集成了MinIO&#xff0c;所以就选了这个 我这边对文件服务性能要求不是太高&#xff0c;单机版就可以 安装非常简单&#xff0c;几个命令就…...