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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【再探】设计模式—抽象工厂及建造者模式

抽象工厂模式和建造者模式都属于创建型模式。两者都能创建对应的对象&#xff0c;而创建者模式更侧重于创建复杂对象&#xff0c;将对象的创建过程封装起来&#xff0c;让客户端不需要知道对象的内部细节。 1 抽象工厂模式 需求&#xff1a; 在使用工厂方法模式时&#xff0…

TCP协议关于速率的优化机制-滑动窗口详解

在上一章中&#xff0c;我们讲述了TCP协议在传输过程中的可靠性http://t.csdnimg.cn/BsImO&#xff0c;这里衔接上一篇文章继续讲&#xff0c;TCP协议的特性&#xff0c;TCP协议写完之后就写&#xff0c;Http和Https等内容吧 1. 滑动窗口 这里的滑动窗口不是指算法里面的双指…

品牌百度百科词条需要什么资料?

品牌百度百科词条是一个品牌的数字化名片&#xff0c;更是品牌历史、文化、实力的全面展现。 作为一个相当拿得出手的镀金名片&#xff0c;品牌百度百科词条创建需要什么资料&#xff0c;今天伯乐网络传媒就来给大家讲解一下。 一、品牌基本信息&#xff1a;品牌身份的明确 品…

用 PyTorch 构建液态神经网络(LNN)

用 PyTorch 构建液态神经网络&#xff08;LNN&#xff09; 文章目录 什么是液态神经网络为什么需要液态神经网络LNN 与 RNN 的区别用 PyTorch 实现 LNNStep 1. 导入必要的库Step 2. 定义网络架构Step 3. 实现 ODE 求解器Step 4. 定义训练逻辑 LNN 的缺陷总结 什么是液态神经网络…

C语言-嵌入式-STM32:FreeRTOS说明和详解

Free即免费的&#xff0c;RTOS的全称是Real time operating system&#xff0c;中文就是实时操作系统。 注意&#xff1a;RTOS不是指某一个确定的系统&#xff0c;而是指一类操作系统。比如&#xff1a;uc/OS&#xff0c;FreeRTOS&#xff0c;RTX&#xff0c;RT-Thread 等这些都…

docker自定义java运行环境镜像

一、下载jre/jdk 压缩包&#xff0c;centos:7基础镜像 1、 下载jdk/dre 下载jdk或jre 官网下载 根据需求下载 jdk:SE Development Kit(开发环境) jre: SE Runtime Environment (运行环境)2、下载centos:7 # 下载centos7 docker镜像 docker pull centos:7#centos查看系统时间 …

面试经典算法题之双指针专题

力扣经典面试题之双指针 ( 每天更新, 每天一题 ) 文章目录 力扣经典面试题之双指针 ( 每天更新, 每天一题 )验证回文串收获 392. 判断子序列 验证回文串 思路 一: 筛选 双指针验证 class Solution { public:bool isPalindrome(string s) {// 所有大写字母 > 小写 去除非字母…

对比mongodb查询的执行计划,说一说组合索引的优化方案(上)

一、背景 Mongodb数据库&#xff0c;有个160w数据量规模的集合&#xff0c;字段多达几十个&#xff0c;随着需求的迭代&#xff0c;查询条件也是五花八门。 为了提高某个查询的效率&#xff0c;结果都以新增索引解决问题&#xff0c;最后多达16个索引。 这里仅贴出本文会提及…

引领农业新质生产力,鸿道(Intewell®)操作系统助力农业机器人创新发展

4月27日至29日&#xff0c;2024耒耜国际会议在江苏大学召开。科东软件作为特邀嘉宾出席此次盛会&#xff0c;并为江苏大学-科东软件“农业机器人操作系统”联合实验室揭牌。 校企联合实验室揭牌 在开幕式上&#xff0c;江苏大学、科东软件、上交碳中和动力研究院、遨博智能研究…

Spring Boot Admin

概述 Spirng Boot Admin 登录页面 Spring Boot Admin是一个用于管理Spring Boot应用的监控工具,它允许你查看和管理多个Spring Boot应用实例。用于应用信息进行界面化的展示&#xff0c;常常辅助我们开发人员快速查看服务运行状态在微服务架构中&#xff0c;Spring Boot Admin通…

中科院突破:TalkingGaussian技术实现3D人脸动态无失真,高效同步嘴唇运动!

DeepVisionary 每日深度学习前沿科技推送&顶会论文分享&#xff0c;与你一起了解前沿深度学习信息&#xff01; 引言&#xff1a;探索高质量3D对话头像的新方法 在数字媒体和虚拟互动领域&#xff0c;高质量的3D对话头像技术正变得日益重要。这种技术能够在虚拟现实、电影…

谷粒商城实战(020 RabbitMQ-消息确认)

Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强 总时长 104:45:00 共408P 此文章包含第258p-第p261的内容 消息确认 生产者 publishers 消费者 consumers 设置配置类 调用api 控制台 抵达brocker 代理 新版本ReturnCallbac…

【webrtc】MessageHandler 8: 基于线程的消息处理:处理音频输入输出断开

m98代码,看起来m114 去掉了MessageHandler :音频的录制和播放 都使用了on message,但只是用来通知并处理流的断开的。AAudioRecorder AAudioRecorder 处理流断开 OnErrorCallback :有可能 错误回调是别处来的,是其他线程, 但是这个错误的处理要再自己的线程执行: 音频播…

北京大学肖臻老师《区块链技术与应用》P14(ETH概述)和P15(ETH账户)

1️⃣ 参考 北京大学肖臻老师《区块链技术与应用》 P14 - ETH概述篇P15 - ETH账户篇 1️⃣4️⃣ETH概述 ① 比特币与以太坊的对比 比特币&#xff08;区块链 1.0&#xff09;以太坊&#xff08;区块链 2.0&#xff09;出块时间大约10 min十几秒mining puzzle计算密集型Memo…

【计算智能】基本遗传算法在优化问题中的应用与实验【理论到程序】

文章目录 1. 引言&#xff1a;遗传算法简介2. 基本遗传算法&#xff08;SGA&#xff09;2.1 基本遗传算法的构成要素1. 染色体编码2. 适应度函数3. 遗传算子 2.2 实验设计与方法1. 算法流程2. 伪代码3. python实现1. 导入模块2. 目标函数 f(x)3 初始化种群4. 计算适应度5. 选择…

Django后台项目开发实战二

我们的需求是开发职位管理系统 三个功能&#xff1a; 管理员发布职位候选人能浏览职位用户能投递职位 第二阶段 创建应用 jobs&#xff0c;实现职位数据的建模 python manage.py startapp jobs 然后再 setting .py 注册应用&#xff0c;只需添加应用名称到最后一行 INST…

VTK —— 二、教程六 - 为模型加入3D微件(按下i键隐藏或显示)(附完整源码)

代码效果 本代码编译运行均在如下链接文章生成的库执行成功&#xff0c;若无VTK库则请先参考如下链接编译vtk源码&#xff1a; VTK —— 一、Windows10下编译VTK源码&#xff0c;并用Vs2017代码测试&#xff08;附编译流程、附编译好的库、vtk测试源码&#xff09; 教程描述 本…

探索未来道路:智慧高速系统架构的革命性进步

随着科技的飞速发展&#xff0c;智慧高速系统架构正在成为道路交通领域的一项重要创新。这一系统结合了先进的信息技术和智能化设备&#xff0c;为高速公路提供了全新的管理和服务模式&#xff0c;极大地提升了交通运输效率和安全性。本文将深入探讨智慧高速系统架构的革命性进…

ping命令操作记录

1&#xff0c;ping 主机可查看主机是否在线 2&#xff0c;ping -a参数&#xff0c;解析主机的名称 3&#xff0c;ping -r 跟踪打印路由信息 ping命令的作用&#xff1a;确认目标主机是否存活&#xff0c;确定网络是否畅通 ping的原理&#xff1a;ping发送ICMP&#xff08;互联…

【算法】【贪心算法】【leetcode】870. 优势洗牌

题目地址&#xff1a;https://leetcode.cn/problems/advantage-shuffle/description/ 题目描述&#xff1a; 给定两个长度相等的数组 nums1 和 nums2&#xff0c;nums1 相对于 nums2 的优势可以用满足 nums1[i] > nums2[i] 的索引 i 的数目来描述。 返回 nums1 的任意排列&…