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日,中国电子党组副书记、总经理李立功一行赴中电金信进行调研,深入听取了中电金信经营发展情况、研发工作及“源启”行业数字底座平台的汇报,并参观了公司展厅和科技研发场所…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
UDP(Echoserver)
网络命令 Ping 命令 检测网络是否连通 使用方法: ping -c 次数 网址ping -c 3 www.baidu.comnetstat 命令 netstat 是一个用来查看网络状态的重要工具. 语法:netstat [选项] 功能:查看网络状态 常用选项: n 拒绝显示别名&#…...
【项目实战】通过多模态+LangGraph实现PPT生成助手
PPT自动生成系统 基于LangGraph的PPT自动生成系统,可以将Markdown文档自动转换为PPT演示文稿。 功能特点 Markdown解析:自动解析Markdown文档结构PPT模板分析:分析PPT模板的布局和风格智能布局决策:匹配内容与合适的PPT布局自动…...
GitHub 趋势日报 (2025年06月08日)
📊 由 TrendForge 系统生成 | 🌐 https://trendforge.devlive.org/ 🌐 本日报中的项目描述已自动翻译为中文 📈 今日获星趋势图 今日获星趋势图 884 cognee 566 dify 414 HumanSystemOptimization 414 omni-tools 321 note-gen …...
C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
NPOI操作EXCEL文件 ——CAD C# 二次开发
缺点:dll.版本容易加载错误。CAD加载插件时,没有加载所有类库。插件运行过程中用到某个类库,会从CAD的安装目录找,找不到就报错了。 【方案2】让CAD在加载过程中把类库加载到内存 【方案3】是发现缺少了哪个库,就用插件程序加载进…...
c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...
