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日,中国电子党组副书记、总经理李立功一行赴中电金信进行调研,深入听取了中电金信经营发展情况、研发工作及“源启”行业数字底座平台的汇报,并参观了公司展厅和科技研发场所…...

Java将文件目录转成树结构
在实际开发中经常会遇到返回树形结构的场景,特别是在处理文件系统或者是文件管理系统中。下面就介绍一下怎么将文件路径转成需要的树形结构。 在Java中,将List<String>转换成树状结构,需要定义一个树节点类(TreeNode&#…...

硬件工程师必读:10条职业发展黄金法则!
在快速发展的科技时代,硬件工程师作为推动技术创新和产业升级的重要力量,其职业发展之路既充满挑战也蕴含无限机遇。为了在这条道路上稳步前行,我们首先需要了解硬件产品的研发流程。 在这个过程中,公司内的每个岗位都发挥着不可或…...

Redis是什么? 日常运维 Redis 需要注意什么 ? 怎么降低Redis 内存使用 节省内存?
你的项目或许已经使用 Redis 很长时间了,但在使用过程中,你可能还会或多或少地遇到以下问题: 我的 Redis 内存为什么增长这么快?为什么我的 Redis 操作延迟变大了?如何降低 Redis 故障发生的频率?日常运维…...

【Android项目】“追茶到底”项目介绍
没有多的介绍,这里只是展示我的项目效果,后面会给出具体的代码实现。 一、用户模块 1、注册(第一次登陆的话需要先注册账号) 2、登陆(具有记住最近登录用户功能) 二、点单模块 1、展示饮品列表 2、双向联动…...

机试:进制转换问题
十进制转任意进制 简单回忆一下十进制我们是怎么转换成二进制的(短除法): 我们会将十进制数不断的进行除2操作,并且记录下每一次的余数(这个余数就是我们最终求的二进制数的组成部分)。 以下以12D举例&a…...

目标检测实战(十五): 使用YOLOv7完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
文章目录 一、目标检测介绍二、YOLOv7介绍三、源码/论文获取四、环境搭建4.1 环境检测 五、数据集准备六、 模型训练七、模型验证八、模型测试九、错误总结9.1 错误1-numpy jas mp attribute int9.2 错误2-测试代码未能跑出检测框9.3 错误3- Command git tag returned non-zero…...

github中fasttext库README官文文档翻译
参考链接:fastText/python/README.md at main facebookresearch/fastText (github.com) fastText模块介绍 fastText 是一个用于高效学习单词表述和句子分类的库。在本文档中,我们将介绍如何在 python 中使用 fastText。 环境要求 fastText 可在现代 …...

WouoUIPagePC端实现
WouoUIPagePC端实现 WouoUIPage是一个与硬件平台无关,纯C语言的UI库(目前只能应用于128*64的单色OLED屏幕上,后期会改进,支持更多尺寸)。因此,我们可以在PC上实现它,本文就以在PC上使用 VScode…...

W801学习笔记十九:古诗学习应用——下
经过前两章的内容,背唐诗的功能基本可以使用了。然而,仅有一种模式未免显得过于单一。因此,在本章中对其进行扩展,增加几种不同的玩法,并且这几种玩法将采用完全不同的判断方式。 玩法一:三分钟限时挑战—…...

类加载器ClassLoad-jdk1.8
类加载器ClassLoad-jdk1.8 1. 类加载器的作用2. 类加载器的种类(JDK8)3. jvm内置类加载器如何搜索加载类--双亲委派模型4. 如何打破双亲委派模型--自定义类加载器5. 自定义一个类加载器5.1 为什么需要自定义类加载器5.2 自定义一个类加载器 6. java代码加…...