【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实现一个进度条小程序
个人主页:🍝在肯德基吃麻辣烫 我的gitee:gitee仓库 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处 文章目录 前言一、理解回车 \r 和换行 \n二、初步认识缓冲区1. 认识第一个函数:sleep2.观察缓冲区…...

江南大学轴承数据故障诊断(利用一维CNN进行故障诊断,代码和数据放在压缩包,无需修改任何东西,解压缩后直接运行,有详细注释)
1.江南大学轴承数据集介绍 采样频率:50khz,采样时间:10s 转速:600 800 1000/rpm 内圈:ib 外圈:ob 滚动体:tb 正常:N 以600转速下的内圈故障数据为例展示: 开始数据…...

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

基于Python爬虫+词云图+情感分析对某东上完美日记的用户评论分析
🤵♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞Ǵ…...

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

【深度学习注意力机制系列】—— SKNet注意力机制(附pytorch实现)
SKNet(Selective Kernel Network)是一种用于图像分类和目标检测任务的深度神经网络架构,其核心创新是引入了选择性的多尺度卷积核(Selective Kernel)以及一种新颖的注意力机制,从而在不增加网络复杂性的情况…...
Markdown语法和表情
Markdown语法和表情 1. 标题2. 段落3. 加粗和斜体4.分隔线5.删除线6.下划线7.引用8.列表9.链接10. 图片11. 代码12.Markdown 表格其他1.支持的 HTML 元素2.转义3.公式 Markdown表情参考 Markdown 是一种轻量级的标记语言,用于简洁地编写文本并转换为HTML。它的语法简…...
CSDN编纂目录索引跳转设置
CSDN编纂目录索引跳转设置 文章目录 题目第一小节第二小节第三小节结论 题目 第一小节 第二小节 第三小节 结论...

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

FastAPI和Flask:构建RESTful API的比较分析
Python 是一种功能强大的编程语言,广泛应用于 Web 开发领域。FastAPI 和 Flask 是 Python Web 开发中最受欢迎的两个框架。本文将对 FastAPI 和 Flask 进行综合对比,探讨它们在语法和表达能力、生态系统和社区支持、性能和扩展性、开发工具和调试支持、安…...
用康虎云报表打印二维码
用康虎云报表打印二维码 1 安装: 下载地址: https://www.khcloud.net/cfprint_download, 选择Odoo免代码报表模块和自定义SQL报表模块 下载下来后解压缩,一共有四个模块 cf_report_designer # 报表设计模块 cf_sale_print_ext # 演示模块 cf_sql_report cfprint …...

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

【EI复现】售电市场环境下电力用户选择售电公司行为研究(Matlab代码实现)
💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…...
并发——何谓悲观锁与乐观锁
乐观锁对应于生活中乐观的人总是想着事情往好的方向发展,悲观锁对应于生活中悲观的人总是想着事情往坏的方向发展。这两种人各有优缺点,不能不以场景而定说一种人好于另外一种人。 悲观锁 总是假设最坏的情况,每次去拿数据的时候都认为别人会…...

【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 邮箱留言 总结 写在前面 这篇文章其实我主要是之前留下的一个心结,依稀记得之前做了一个大屏项目的时候&…...

Python AI 绘画
Python AI 绘画 本文我们将为大家介绍如何基于一些开源的库来搭建一套自己的 AI 作图工具。 需要使用的开源库为 Stable Diffusion web UI,它是基于 Gradio 库的 Stable Diffusion 浏览器界面 Stable Diffusion web UI GitHub 地址:GitHub - AUTOMATI…...
mongodb:环境搭建
mongodb 是什么? MongoDB是一款为web应用程序和互联网基础设施设计的数据库管理系统。没错MongoDB就是数据库,是NoSQL类型的数据库 为什么要用mongodb? (1)MongoDB提出的是文档、集合的概念,使用BSON&am…...

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

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

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型
摘要 拍照搜题系统采用“三层管道(多模态 OCR → 语义检索 → 答案渲染)、两级检索(倒排 BM25 向量 HNSW)并以大语言模型兜底”的整体框架: 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后,分别用…...

接口测试中缓存处理策略
在接口测试中,缓存处理策略是一个关键环节,直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性,避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明: 一、缓存处理的核…...

C++实现分布式网络通信框架RPC(3)--rpc调用端
目录 一、前言 二、UserServiceRpc_Stub 三、 CallMethod方法的重写 头文件 实现 四、rpc调用端的调用 实现 五、 google::protobuf::RpcController *controller 头文件 实现 六、总结 一、前言 在前边的文章中,我们已经大致实现了rpc服务端的各项功能代…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...
【C语言练习】080. 使用C语言实现简单的数据库操作
080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
MySQL用户和授权
开放MySQL白名单 可以通过iptables-save命令确认对应客户端ip是否可以访问MySQL服务: test: # iptables-save | grep 3306 -A mp_srv_whitelist -s 172.16.14.102/32 -p tcp -m tcp --dport 3306 -j ACCEPT -A mp_srv_whitelist -s 172.16.4.16/32 -p tcp -m tcp -…...