Linux的vim下制作进度条
目录
前言:
回车和换行有区别吗?
回车和换行的区别展示(这个我在Linux下演示)
为什么会消失呢?
回车和换行的区别
为什么'\r'和'\n'产生的效果不同?
打印进度条:
(1)打印字符串
(2)显示百分数
(3)完结撒花
前言:
在这里我要问大家一个问题,请问:
回车和换行有区别吗?
有些人的回答是:我感觉没区别啊,Enter键就是回车,我平时按了就换行了
有些人的回答是:有区别,但是我也具体说不出来,但是在C语言里,换行是'\n',但是回车却是'\r'
其实答案是:有区别
回车和换行的区别展示(这个我在Linux下演示)
但我们在一个test.c文件中写入如下代码时:
#include <stdio.h>#include <unistd.h>//注意头文件int main(){printf("Hello 努力的你\n"); sleep(3); return 0; }
会输出
Hello 努力的你
并且停顿三秒 (停顿时如下所示)


这并不稀奇,但是你将代码里的'\n'换为'\r'时,如下
#include <stdio.h>#include <unistd.h>//注意头文件int main(){printf("Hello 努力的你\r"); sleep(3); return 0; }
你同样会发现停顿了三秒,但并未输出任何东西(停顿时如下所示)

但当在sleep(3);之前加入
fflush(stdout);
{
关于fflush的原型的查看,C语言中我们右cplusplus,或者MSDN,但在Linux下,Linux自带了功能查询,我们可以在命令行中输入以下代码来查看相应功能(要退出,则输入:q
要上下翻:用键盘的上下键(千万不要用鼠标哦,自己可以试试看哦,在Linux下,鼠标大多是没用的))
man fflush
//man 命令:可以查看该命令的具体信息
将会出现如下信息

是不是和cplusplus和MSDN很像
这里我们看出fflush属于<stdio.h>这个文件
它的参数为一个文件指针(Linux内部,一切视为文件)
而我们这里需要把stdout(标准输出流)作为参数(后面会说为什么)
}
代码如下所示:
1 #include <stdio.h>2 #include <unistd.h>3 4 int main()5 {9 printf("Hello 努力的你\r");10 fflush(stdout); 11 sleep(3);14 return 0; 15 }
这时会显示出“Hello 努力的你”

细心的你可能会发现,这里的光标并不像往常一样在打印的这句话的最后,而是在开头
而这个代码 被执行 到 执行完 经历了以下过程:
先打印“Hello 努力的你”,再停顿3秒, “Hello 努力的你”再消失不见
为什么会消失呢?
这就回到了我们一开始的问题: 回车和换行有区别吗?
答案也公布了,是有的
回车和换行的区别
在一些键盘中,Enter键可能会是如下样子:

大家有没有思考过,明明是换行功能,它为什么还有个转折呢?
如果用画图来表示换行,那将是这个样子:

只是行变了,列并没有变
但是回车,就是如下样子:

行变了,而列回到了新一行的开头
(这也是为什么键盘的Enter键长那个样子的原因)
这就是换行和回车的不同
为什么'\r'和'\n'产生的效果不同?
*为什么'\r'时就不显示任何东西呢(没有fflush的情况下)
*这里要讲到缓冲区的概念
*因为在计算机内部,如果每次输出直接输出到屏幕,是非常慢的,因为它是外部设备,输出需要用到CPU的运行,但是一个计算机的快慢也满足短板原理,慢的步骤会决定整个步骤的快慢,
在计算机中速度由快到慢是:
CPU > 内存 > 磁盘
我们不能只要要输出就占用CPU资源,这就需要设置一个区域专门的区域来存储即将输出的数据,而内存就是一个比较高性价比的地方,速度不快不慢,价格也适中,这就有了缓冲区
而我们经常做的printf语句输出的内容通常并不是该语句执行完了就立马打印,而是先放在缓冲区再打印,但是为什么平时看起来是立马打印呢?😶😶😶
因为我们通常会在printf的语句的最后加上一个'\n',当遇到'\n'时,计算机会自动刷新缓冲区的内容到输出设备,而我们的printf就是输出到显示器,这就是为啥printf完就立马输出的原因(⊙o⊙)!!!me懂了
但是'\r'并不和'\n'一样具有刷新缓冲区的功能(●ˇ∀ˇ●),它将要打印的语句放进了缓冲区,当程序快结束时,再输出,但是'\r'会将光标移到一行的开头!!!!!!!!!.......Σ(っ °Д °;)っ哇哦,所以当要打印时,显示器上会显示光标前的内容,并清空缓冲区,但是光标已经在缓冲区的开头,所以没有输出任何东西ฅʕ•̫͡•ʔฅ
而fflush的作用是(⊙o⊙)????
这个也在之前的man fflush的文件中写了

翻译ヾ(≧▽≦*)o: 对于输出流,fflush()通过流的底层写函数强制为给定的输出或更新流写入所有用户空间缓冲数据。对于输入流,fflush()将丢弃从底层文件中获取但尚未被应用程序使用的任何缓冲数据。流的打开状态不受影响。
也就是说会打印缓冲区的内容,并刷新缓冲区
而我们的“Hello 努力的你”就在缓冲区里,所以被打印了出来,但是'\r'还是让光标回到了打印的语句的最开头,所以sleep三秒后,缓冲区的刷新,让“Hello 努力的你”这句话不见了
不知道到这里你看懂了吗?你可是看了快两千字了哦,太厉害了吧,夸夸自己(/≧▽≦)/,给你赞一个d=====( ̄▽ ̄*)b

现在就要讲各位心心念念的进度条的实现啦~~~
先看看效果啦~~(转gif失败了(哭哭){{{(>_<)}}})

首先进度条是一个字符串,因此,要设置一个字符串
char jin_du_tiao[150];
同时我们要控制它的进度条的#个数不断增加----->需要一个循环来给进度条不断增加字符----->不能无限循环,要有退出条件----->设置一个变量,当这个变量长度为100时就退出循环
while (cnt <= 100){jin_du_tiao[cnt++] = '#';}
打印进度条:
(1)打印字符串
while (cnt <= 100){printf("%s\n", jin_du_tiao);jin_du_tiao[cnt++] = '#';}
(2)显示百分数
在格式输出中,显示百分号用:
%%
while (cnt <= 100){printf("%s%d%%\n", jin_du_tiao, cnt);jin_du_tiao[cnt++] = '#';}
但是这样子打印出来的结果是😥:
0%
#1%
##2%
.
.
.################################################################100%
谁家进度条的进度跟着进度条走啊😣😣,何况进度条走那么快,谁看得清那个数字😫啊,而且 数字 和 # 紧紧挨在一起一点都不好看😡
这就用到了格式控制符 .......ε=ε=ε=(~ ̄▽ ̄)~
while (cnt <= 100){printf("[%-100s][%d%%]\n", jin_du_tiao, cnt);// -:左对齐 100:让后面的百分比不会跟着进度条跑 %%:显示百分号jin_du_tiao[cnt++] = '#';}
-:左对齐 100:让后面的百分比不会跟着进度条跑 %%:显示百分号
但是这样子打印出来的效果是:
[ ] [0%]
[#] [1%]
[##] [2%]
.
.
.
.
[#################################################################][100%]
没有左对齐时:
[ ] [0%]
[ #] [1%]
[ ##] [2%]
.
.
.
.
[#################################################################][100%]
谁家进度条一行一行的啊 ╰(‵□′)╯,进度条不应该在一行吗?
欸嘿,这里就用到了'\r'啦~~~~,'\r'起到了从头开始打印的效果
while (cnt <= 100){printf("[%-100s][%d%%]\r", jin_du_tiao, cnt);// -:左对齐 100:让后面的百分比不会跟着进度条跑 \r:有刷新的效果 %%:显示百分号jin_du_tiao[cnt++] = '#';fflush(stdout); //一定记得要fflush(stdout)}
但是这样你会发现,当你一执行就会显示完整的进度条 (。・・)ノ
[#################################################################][100%]
所以让它sleep一下下~~~~~,可是sleep就比较懒(。>︿<)_θ,很慢,这样子打印进度条就超慢,这样子使用者恨不得卸载软件啦 ~Σ(っ °Д °;)っ
那就换个勤快点的吧:usleep
sleep:以秒为单位
usleep:以微秒为单位
(3)完结撒花
int main()
{int cnt = 0;char jin_du_tiao[150];while (cnt <= 100){printf("[%100s][%d%%]\r", jin_du_tiao, cnt);// -:左对齐 100:让后面的百分比不会跟着进度条跑 \r:有刷新的效果 %%:显示百分号jin_du_tiao[cnt++] = '#';fflush(stdout); //一定记得要fflush(stdout)usleep(300000);//usleep(300000):以毫秒为单位 注意包含头文件:<unistd.h>}return 0;
}
哦吼吼,太酷了,你快看了四千字哦,给你大大的赞哦 👍,我也和这几千字合个影吧(写了快四个小时)✌😀✌
相关文章:
Linux的vim下制作进度条
目录 前言: 回车和换行有区别吗? 回车和换行的区别展示(这个我在Linux下演示) 为什么会消失呢? 回车和换行的区别 为什么\r和\n产生的效果不同? 打印进度条: (1)打印字符串 …...
C++学习笔记2
T1 奇怪的教室 题目背景 LSU 的老师有个奇怪的教室,同学们会从左到右坐成一个横排,并且同一个位置可以坐多个同学。这天,入学考试的成绩下来了。同学们想根据入学考试的成绩,找出班里学霸扎堆的区域“学霸区”。 题目描述 共有…...
细数:智能物流装备界的并购案~
导语 大家好,我是智能仓储物流技术研习社的社长,老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 近年来,随着智能仓储物流行业的快速发展,全球范围内的并购活动日益频繁,各大企…...
微信小程序播放编码为 video/mp4;codecs=vp8 opus 的视频没有声音
最近在做浏览器录屏功能,主要是录屏加上麦克风生成mp4视频,最终生成的是编码为 video/mp4;codecsvp8 opus 的视频,音频编码因为是 opus 是无法在小程序正常播放的,这样就导致了视频没有声音。后来就在服务端做了一层转换ÿ…...
Linux 指令lsblk 作用,以及查看cpu使用情况和磁盘IO iostat指令详解
lsblk 指令 在Linux系统中,lsblk(列表块设备)命令是一个非常实用的工具,用于显示所有可用的块设备信息,如硬盘、USB驱动器、SD卡以及它们的分区。这个命令以易于理解的树状结构展示这些信息,清晰地表明了设…...
Mybatis之Sqlsession、Connection和Transaction三者间的关系
前言 最近在看Mybatis的源码,搜到这篇文章Sqlsession、Connection和Transaction原理与三者间的关系,debug之后发现有不少疑惑,于是按照原文整理了一下,记录下debug中的一些困惑点。 对于我们开发来讲,不管跟任何关系…...
WRT1900ACS搭建openwrt服务器小记
参考链接 wrt1900acs openwrt wrt1900acs openwrt 刷机 wrt1900acs原生固件刷openwrt-23.05.3-mvebu-cortexa9-linksys_wrt1900acs-squashfs-factory.img wrt1900acs openwrt更新刷openwrt-23.05.3-mvebu-cortexa9-linksys_wrt1900acs-squashfs-sysupgrade.bin 通过WEB UI来…...
Spring AOP(3)
目录 Spring AOP原理 代理模式 代理模式中的主要角色 静态代理 动态代理 总结:面试题 什么是AOP? Spring AOP实现的方式有哪些? Spring AOP实现原理 Spring使用的是哪种代理方式? JDK和CGLIB动态代理的区别? Spring AOP原理 代理模式 代理模式, 也叫委托模式. …...
推荐5个免费的国内平替版GPT
提起AI,大家第一个想到的就是GPT。 虽然它确实很厉害,但奈何于我们水土不服,使用门槛有些高。 不过随着GPT的爆火,现在AI智能工具已经遍布到各行各业了,随着时间的推移,国内的AI工具也已经“百花盛放”了…...
弹性云服务器是什么,为何如此受欢迎
云计算作为当下炙手可热的技术领域,已然成为现代企业不可或缺的核心能力。云服务器作为云计算的基石之一,在这个数字化时代发挥着至关重要的作用。而弹性云服务器,作为云服务器的一种演进形式,更是备受瞩目。 弹性云服务器&#…...
Docker部署RabbitMQ与简单使用
官网地址: Messaging that just works — RabbitMQ 我的Docker博客:Docker-CSDN博客 1.结构 其中包含几个概念: **publisher**:生产者,也就是发送消息的一方 **consumer**:消费者,也就是消费消息的一方 …...
2024年黄石市建设优质工程评价认定申报条件、流程及材料合集
2024年黄石市建设优质工程评价认定申报条件、流程及材料合集如下,黄石市的企业单位可以了解一下,有疑问名字找我哦。 第一章总则 第一条为贯彻落实《中华人民共和国建筑法》、《安全生产法》、《建设工程质量管理条例》、《建设工程安全生产管理条例》…...
偏微分方程算法之混合边界条件下的差分法
目录 一、研究目标 二、理论推导 三、算例实现 四、结论 一、研究目标 我们在前几节中介绍了Poisson方程的边值问题,接下来对椭圆型偏微分方程的混合边值问题进行探讨,研究对象为: 其中,为矩形区域,为上的连续函数…...
apollo资料整理
Application X: Application X Apollo: Apollo 自动驾驶开放平台 Cyber RT API tutorial — Cyber RT Documents documentation Cyber RT API tutorial — Cyber RT Documents documentation GitHub - daohu527/dig-into-apollo: Apollo notes (Apollo学习笔记) - Apollo l…...
森林消防新利器:高扬程水泵的革新与应用/恒峰智慧科技
随着全球气候变化的加剧,森林火灾的频发已成为威胁生态安全的重要问题。在森林消防工作中,高效、快速的水源供给设备显得尤为重要。近年来,高扬程水泵的广泛应用,为森林消防工作带来了新的希望与突破。 一、高扬程水泵的技术优势 …...
Microsoft Universal Print 与 SAP 集成教程
引言 从 SAP 环境打印是许多客户的要求。例如数据列表打印、批量打印或标签打印。此类生产和批量打印方案通常使用专用硬件、驱动程序和打印解决方案来解决。 Microsoft Universal Print 是一种基于云的打印解决方案,它允许组织以集中化的方式管理打印机和打印机驱…...
VBA在Excel中字母、数字的相互转化
VBA在Excel中字母、数字的相互转化 字母转数字的方法 数字转字母的方法 众所周知,Excel表中的行以数字展示,列用字母展示,如下图: 编程时,很多时候需要将列的字母转变为数字使用,如cells(num1,num2).value等,不知大家是怎么将字母转化为数字的,Excel是否有其他方式…...
【C语言】——联合体与枚举
【C语言】——联合体与枚举 一、联合体1.1、联合体类型的声明1.2、联合体的特点1.3、相同成员的结构体和联合体对比1.4、联合体的大小计算1.5、联合体的应用举例 二、枚举2.1、枚举类型的声明2.2、枚举类型的优点 一、联合体 1.1、联合体类型的声明 联合体也叫做共用体 与…...
java线上问题排查之内存分析(三)
java线上问题排查之内存分析 使用top命令 top命令显示的结果列表中,会看到%MEM这一列,这里可以看到你的进程可能对内存的使用率特别高。以查看正在运行的进程和系统负载信息,包括cpu负载、内存使用、各个进程所占系统资源等。 2.用jstat命令…...
中电金信:金Gien乐道 | 4月要闻速览,精彩再回顾
中国电子党组副书记、总经理李立功一行调研中电金信 4月10日,中国电子党组副书记、总经理李立功一行赴中电金信进行调研,深入听取了中电金信经营发展情况、研发工作及“源启”行业数字底座平台的汇报,并参观了公司展厅和科技研发场所…...
观成科技:隐蔽隧道工具Ligolo-ng加密流量分析
1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具,该工具基于TUN接口实现其功能,利用反向TCP/TLS连接建立一条隐蔽的通信信道,支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式,适应复杂网…...
从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...
中南大学无人机智能体的全面评估!BEDI:用于评估无人机上具身智能体的综合性基准测试
作者:Mingning Guo, Mengwei Wu, Jiarun He, Shaoxian Li, Haifeng Li, Chao Tao单位:中南大学地球科学与信息物理学院论文标题:BEDI: A Comprehensive Benchmark for Evaluating Embodied Agents on UAVs论文链接:https://arxiv.…...
【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
python/java环境配置
环境变量放一起 python: 1.首先下载Python Python下载地址:Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个,然后自定义,全选 可以把前4个选上 3.环境配置 1)搜高级系统设置 2…...
MMaDA: Multimodal Large Diffusion Language Models
CODE : https://github.com/Gen-Verse/MMaDA Abstract 我们介绍了一种新型的多模态扩散基础模型MMaDA,它被设计用于在文本推理、多模态理解和文本到图像生成等不同领域实现卓越的性能。该方法的特点是三个关键创新:(i) MMaDA采用统一的扩散架构…...
从零实现STL哈希容器:unordered_map/unordered_set封装详解
本篇文章是对C学习的STL哈希容器自主实现部分的学习分享 希望也能为你带来些帮助~ 那咱们废话不多说,直接开始吧! 一、源码结构分析 1. SGISTL30实现剖析 // hash_set核心结构 template <class Value, class HashFcn, ...> class hash_set {ty…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Spring是如何解决Bean的循环依赖:三级缓存机制
1、什么是 Bean 的循环依赖 在 Spring框架中,Bean 的循环依赖是指多个 Bean 之间互相持有对方引用,形成闭环依赖关系的现象。 多个 Bean 的依赖关系构成环形链路,例如: 双向依赖:Bean A 依赖 Bean B,同时 Bean B 也依赖 Bean A(A↔B)。链条循环: Bean A → Bean…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
