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;
}

哦吼吼,太酷了,你快看了四千字哦,给你大大的赞哦 👍,我也和这几千字合个影吧(写了快四个小时)✌😀✌

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/660816.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Mac】mac 安装 prometheus 报错 prometheus: prometheus: cannot execute binary file

1、官网下载 Download | Prometheus 这里下载的是prometheus-2.51.2.linux-amd64.tar.gz 2、现象 解压之后启动Prometheus 启动脚本&#xff1a; nohup ./prometheus --config.fileprometheus.yml > prometheus.out 2>&1 & prometheus.out日志文件&#xff…

量子城域网建设设备系列(一):光量子交换机

通过一段时间的讨论&#xff0c;我们已经对城域网的建设有了一定的基础概念&#xff0c;从本文开始&#xff0c;我们将逐步开始讨论量子城域网建设过程中的设备。本文我们讨论光量子交换机。 1.光量子交换机的基本概念 如下图为两个国产光量子交换机&#xff0c;这两款设备均用…

IDEA 中 git fetch 验证报错 The provided password or token is incorrect

参考链接&#xff1a; 【GitLab】-HTTP Basic: Access denied.remote:You must use a personal access token_http basic: access denied. the provided password o-CSDN博客 idea使用gitLab报错&#xff1a;remote: HTTP Basic: Access denied_idea remote: http basic: acc…

【webrtc】MessageHandler 3: 基于线程的消息处理:以sctp测试为例

消息处理可以用于模拟发包处理G:\CDN\rtcCli\m98\src\net\dcsctp\socket\dcsctp_socket_network_test.cc 这个实现中,onMessage还是仅对了一种消息进行处理,就是接收则模式下,打印带宽。当然,可能程序有多个消息,分别在不同的onmessage中执行?SctpActor:以一个恒定的速率…

【webrtc】MessageHandler 4: 基于线程的消息处理:以Fake 收发包模拟为例

G:\CDN\rtcCli\m98\src\media\base\fake_network_interface.h// Fake NetworkInterface that sends/receives RTP/RTCP packets.虚假的网络接口,用于模拟发送包、接收包单纯仅是处理一个ST_RTP包 消息的id就是ST_RTP 类型,– 然后给到目的地:mediachannel处理: 最后消息消…

Django后台项目开发实战五

完成两个功能&#xff1a; HR 可以维护候选人信息面试官可以录入面试反馈 第五阶段 创建 interview 应用&#xff0c;实现候选人面试评估表的增删改功能&#xff0c;并且按照页面分组来展示不同的内容&#xff0c;如候选人基础信息&#xff0c;一面&#xff0c;二面的面试结…

思考!思考!jmeter线程数≠用户并发数

最近又在搞性能测试了&#xff0c;相较于之前的写脚本出数据就完事&#xff0c;这次深入的思考了一下测试出来的指标&#xff0c;到底有什么意义&#xff1f;&#xff1f;&#xff1f; 绞尽脑汁思考了好几天&#xff0c;终于有了点思路&#xff0c;写出来与大家分享&#xff0…

一个单例模式中使用std::unique_ptr引起的莫名其妙的COFF损坏的问题(未解决)

使用static std::unique_ptr和static std::shared_ptr都不行struct IElementAgendaEvents {//! Called to allow listeners to modify the agenda by adding/removing entries before applying tool operation. Return true if entries added or invalidated.virtual bool …

如何给MP3添加专辑封面

MP3的专辑封面可以直接显示在音频播放器上&#xff0c;但如果我们的音乐文件没有专辑封面怎么办&#xff1f;下面来给大家介绍如何添加mp3封面 打开智游剪辑&#xff08;官网&#xff1a;zyjj.cc&#xff09;&#xff0c;搜索音乐封面添加 我们上传一下音乐文件和专辑封面&…

2024最新版JavaScript逆向爬虫教程-------基础篇之常用的编码与加密介绍(python和js实现)

目录 一、编码与加密原理1.1 ASCII 编码1.2 详解 Base641.2.1 Base64 的编码过程和计算方法1.2.2 基于编码的反爬虫设计1.2.3 Python自带base64模块实现base64编码解码类封装 1.3 MD5消息摘要算法1.3.1 MD5 介绍1.3.2 Python实现md5以及其他常用消息摘要算法封装 1.4 对称加密与…

搭建和配置Stable Diffusion环境,超详细的本地部署教程

跃然纸上的创意、瞬息万变的想象&#xff0c;Stable Diffusion以AI的力量赋予您无限创作可能。在这篇详尽的本地部署教程中&#xff0c;我们将携手走进Stable Diffusion的世界&#xff0c;从零开始&#xff0c;一步步搭建和配置这个强大的深度学习环境。无论您是热衷于探索AI艺…

Large Language Models for Test-Free Fault Localization

基本信息 这是24年2月发表在ICSE 24会议&#xff08;CCF A&#xff09;的一篇文章&#xff0c;作者团队来自美国卡内基梅隆大学。 博客创建者 武松 作者 Aidan Z.H. Yang&#xff0c;Claire Le Goues&#xff0c;Ruben Martins&#xff0c;Vincent J. Hellendoorn 标签 …