【Linux从入门到精通】C语言模拟实现进度条小程序

news2024/9/24 5:28:38

  在Linux下,我们安装软件时会经常看到进度条,来告知我们安装的进度。我们不妨自己模拟实现一个进度条,看看其中的细节。模拟实现进度条并不困难,但其中的细节我们又不可忽视。本篇文章会对模拟实现进度条进行详解

文章目录

一、进度条整体模板

二、输出缓冲区详解

三、模拟实现进度条思路及代码详解

3、1 回车和换行区别

3、2 模拟实现进度条思路详解

3、2、1 初阶进度条

3、2、2 进阶进度条


🙋‍♂️ 作者:@Ggggggtm 🙋‍♂️

👀 专栏:Linux从入门到精通 、高频面试问题👀

💥 标题:模拟实现进度条小程序 💥

 ❣️ 寄语:与其忙着诉苦,不如低头赶路,奋路前行,终将遇到一番好风景 ❣️

一、进度条整体模板

  谈到进度条,我们首先想到的是一个动态表示进度的显示程序。 首先,我们先来看一下进度条整体的模板,也就是我们所要模拟实现的进度条。如下:

模板1:

模板2:

  我们看到,上述有两个模板,两个模板大同小异,只是输出格式不同而已。我们似乎已经有了一个大概的整体思路。无非就是格式打印输出嘛。真的是这样吗?确实是这样。但并不只是单纯的输入和输入。其中还涉及到了缓冲区和回车、换行的概念和细节。我们接着往下看。

二、输出缓冲区详解

  我们平常使用的printf函数,是输出到屏幕。但是是直接输出到屏幕的吗?我们看下面的例子:

#include<stdio.h>      
    
int main()    
{    
  int i=0;    
  for(i=5;i>=0;i--)                                                                                                                                          
  {    
    printf("%d",i);      
    sleep(1);  //睡眠1秒
  }    
  return 0;    
}

  我们看上述代码,输出结果是什么呢?我们第一反应是每间隔一秒依次输出5、4、3、2、1、0。我们直接看结果:

  我们看到并非每间隔一秒依次输出5、4、3、2、1、0。而是过了6秒后直接输出了5、4、3、2、1、0。这是为什么呢?从这例子,我们间接了解到输出并非直接输出到屏幕上。那中间还有什么呢?其实,我们输出是先输出到了缓冲区。缓冲区又分为输入缓冲区输出缓冲区。这里明显的是先输出到了输出缓冲区。

  我们再看一个例子:

#include<stdio.h>      
    
int main()    
{    
  int i=0;    
  for(i=5;i>=0;i--)                                                                                                                                          
  {    
    printf("%d\n",i);       
    sleep(1);  //睡眠1秒
  }    
  return 0;    
}

  上面的代码相对于第一个例子,我们多了一个换行。我们再看一下输出结果:

  我们看到是每间隔一秒依次输出5、4、3、2、1、0。这又是为什么呢?这就关系到了把输出缓冲区的内容刷新到屏幕上的规则:

  1. 程序正常结束,作为main函数return操作的一部分,缓冲区被刷新。
  2. 当缓冲区的内容满了的时候,缓冲区会自动刷新到屏幕上。
  3. 可以使用操作符endl、fflush和 ends 来显示的刷新缓冲区。这三个都是IO库中的操作符,endl能完成换行和刷新缓冲区的工作。flush只完成刷新缓冲区的工作。而ends会向缓冲区插入一个空字符,然后刷新缓冲区。

  了解到了输出缓冲区的刷新规则后,我们对上面的两个例子的输出结果就很容易理解了。当然,我们讲解了这么多输出缓冲区是为什呢?我们先回到模拟实现进度条,我们打印的进度条,是在一行上打印出的,并没有换行。这里就引出了两个问题怎么做到不换行还能不断动态更新打印数据呢怎么及时打印出缓冲区的数据呢?我们接着往下看。

三、模拟实现进度条思路及代码详解

3、1 回车和换行区别

  我们上面的问题是:怎么做到不换行还能不断动态更新打印数据呢?首先换行( \ n )是不可以的。这里我们就可以用回车( \ r )啊???换行和回车不一样吗?答案是不一样的

  回车 \r 本义是光标重新回到本行开头,r的英文return,控制字符可以写成CR,即Carriage Return。

  换行 \n 本义是光标往下一行(不一定到下一行行首,还有可能是接上一行 行末另起一行。),n的英文newline,控制字符可以写成LF,即Line Feed。

  但是回车并不能刷新缓冲区。所以我们还要用到fflush(stdout)来刷新缓冲区到屏幕上。我们可结合下面例子一起理解一下:

#include<stdio.h>    
#include<unistd.h>    
    
int main()    
{    
  int i=0;    
  for(i=5;i>=0;i--)    
  {    
    printf("%d\r",i);                                                                                                                                        
    fflush(stdout);    
    sleep(1);    
  }    
  return 0;    
} 

  通过不断的在同一行输出,我们可以得到一个类似倒计时的小程序,具体输出结果如下:

  通过上面的例子,我们可以很好的理解回车和换行的区别。同时又解决了上述的两个问题。 

3、2 模拟实现进度条思路详解

3、2、1 初阶进度条

  首先,我们想到的是进度条完成是达到百分之百。那我们可以定义一个长度为105字符数组,这里多5个位置,是为了防止越界造成不必要的麻烦注意,打印字符串时遇到‘\0’停止)。我们可通过100次循环,不断改变字符数组内容,再同过回车(\r)和格式化输出,我们就可以得到一个初步形式的进度条。我们结合代码一起理解:

#include<stdio.h>    
#include<unistd.h>    
#include<string.h>    
    
#define MAX 105    
    
int main()    
{    
  int i=0;    
  char bar[MAX];    
    
  memset(bar,0,sizeof(bar));   //初始化字符数组为0
      
  while(i<=100)    
  {    
    printf("[%-100s][%3d%%] \r",bar,i,);     
    fflush(stdout);    
    
    bar[i]='#';    
    i++;    
    usleep(50000);    
  }    
    
  printf("\n");    
  return 0;     
}   

  上面我们可以看到有usleep函数。sleep函数睡眠时间是以秒为级别的。usleep是以微妙级别的。usleep(50000)也就是睡眠0.05秒。循环100次一共是睡眠5秒,也就是我们5秒多一点可以完成打印整个进度条。我们看输出结果:

3、2、2 进阶进度条

  我们为了表示进度条在运行,我们可在最后加上一个旋转的字符表示正在运行。怎么加一个旋转的字符呢?我们可创建一个字符数组,存储旋转字符的不同状态。进而通过循环来控制字符旋转。我们可看如下代码:

#include<stdio.h>    
#include<unistd.h>    
#include<string.h>    
    
#define MAX 100    
    
int main()    
{    
  int i=0;    
  char bar[MAX+5];    
    
  memset(bar,0,sizeof(bar));    
    
  const char* arr="|\\-/";    //旋转字符数组
  while(i<=100)    
  {    
    
    printf("[%-100s][%3d%%] %c\r",bar,i,arr[i%4]);                                                                                                           
    fflush(stdout);                                                                                                                     
                                                                                                                                        
    bar[i]='#';

    //bar[i] = '-';
    //bar[i+1] = '>';     //另一种格式                                                                                       
    i++;                                                                                                                                
    usleep(50000);                                                                                                                      
  }                                                                                                                                     
                                                                                                                                        
  printf("\n");                                                                                                                         
  return 0;                                                                                                                             
}

  我们直接看输出结果:

  最后会有一个动态表示的字符。这样看起来就会比较完整。当然,输出的格式我们可以自己选择。输出的颜色也可通过查询添加到自己的输入格式当中。

  以上就是整个用C语言实现的进度条。其中有很多细节还是比较重要的,需要我们重点掌握。希望本篇文章会对你有所帮助,感谢观看ovo~ 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

顺序表(数据结构)---排队啦!

目录 前言&#xff1a; 1.线性表的性质 2.静态数组or动态数组 2.1静态数组 2.2动态数组 3.结构体的创建 4*接口函数的详细讲解 4.1初始化结构体 4.2尾插 4.3打印数据 4.4用完后销毁创建的堆空间 4.5 尾删 4.6头插 4.7头删 4.8查找 4.9任意位置插入 4.10任意位…

springboot+jsp商务安全邮箱(源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot商务安全邮箱。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 &#x1f495;&#x1f495;作者&#xff1a;风歌&…

谈谈Edge浏览器新出的分屏功能

谈谈Edge浏览器新出的分屏功能 前言 在 2023 年三月份微软为 Microsoft Edge 浏览器的稳定版本带来了一个新功能 —— 分屏浏览 (Split Screen)&#xff0c;此功能允许用户在当前页面以左右视图的形式并排打开两个标签页面&#xff0c;作用上类似于应用的分屏可以让浏览器同时处…

Kali Linux部署qemu虚拟化启动img镜像文件

一、先下载最新版本的Kali环境 Kali Linux官网下载网址&#xff1a;Get Kali | Kali Linux 安装到VMware里面后&#xff0c;调整内存大小为4G&#xff08;如果自己电脑内存32G的话&#xff0c;可以调整为8G&#xff09; 更新一下Kali Linux源 然后安装如下软件 apt install qe…

二十九、交换机堆叠与集群

文章目录 堆叠技术概述一、可靠组网二、堆叠技术名称三、华为堆叠原理1、基本概念2、堆叠端口&#xff1a;&#xff08;逻辑端口&#xff09;3、堆叠拓扑类型4、堆叠硬件要求 四、堆叠配置示例&#xff08;华三模拟器&#xff09;1、sw1&#xff1a;2、sw2&#xff1a;3、激活i…

弹射起步——pythonweb开发Flask框架,前端原生+Flask后端框架+mysql数据库实战(附带小案例)

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

HCT:深度是我们没有的奢侈品

文章目录 Deep is a Luxury We Don’t Have摘要本文方法Efficient AttentionThe HCT Architecture Deep is a Luxury We Don’t Have 摘要 医学图像具有高分辨率。高分辨率对于早期发现恶性组织至关重要。然而&#xff0c;这一解决方案在建模长期依赖性方面提出了挑战。浅层t…

接口自动化测试的神器:使用Python编写高效的自动化测试工具

B站首推&#xff01;2023最详细自动化测试合集&#xff0c;小白皆可掌握&#xff0c;让测试变得简单、快捷、可靠https://www.bilibili.com/video/BV1ua4y1V7Db 目录 摘要&#xff1a; 安装工具&#xff1a; 测试脚本 编写python脚本 1.使用requests发送HTTP请求 2.使用py…

生产环境出现CPU占用过高,请谈谈你的分析思路和定位

假如生产环境出现CPU占用过高&#xff0c;请谈谈你的分析思路和定位 记一次印象深刻的故障&#xff1f; 结合Linux 和 JDK命令一起分析&#xff0c;步骤如下 使用top命令找出CPU占比最高的 ps -ef 或者 jps 进一步定位&#xff0c;得知是一个怎么样的后台程序出的问题 定位…

夏驰和徐策的解决数学问题思路——反证法

反证法是一种证明方法&#xff0c;它的基本思路是通过假设某个结论不成立&#xff0c;然后构造出一个矛盾的情况来推导出原先假设的结论是成立的。 具体来说&#xff0c;反证法一般包含以下步骤&#xff1a; 1. 假设所要证明的命题不成立。 2. 通过这个假设&#xff0c;构造…

网易云音乐开发--个人中心页效果实现

内网穿透 就是我们真机调试&#xff0c;是没有数据的 就是我们手机上去访问我们电脑上自己搭的服务器&#xff0c;肯定是访问不到的 此时就需要我们内网穿透 1.winR 输入 cmd 输入ipconfig 2.找到无线局域网适配器的IPv4 3.重新设置一个新的地址&#xff0c;只需将host中…

Snipaste介绍、安装、使用技巧(截图贴图工具)

一、简介 Snipaste 是一个简单但强大的截图贴图工具&#xff0c;也可以让你将截图贴回到屏幕上&#xff01;下载并打开 Snipaste&#xff0c;按下 F1 来开始截图&#xff0c;再按 F3&#xff0c;截图就在桌面置顶显示了。就这么简单&#xff01; 你还可以将剪贴板里的文字…

HTMLCxx 编译说明

1、编译库 下载htmlcxx之后&#xff0c;打开项目编译工程&#xff1a; 双击编译之后&#xff0c;会出现错误&#xff1a; 此时&#xff0c;双击定位到错误的位置&#xff1a; 去掉双引号&#xff0c;重新输入 "",编译通过 2、引用库解析数据 这时候会定位到当前的错…

双目测距--3 双目标定

目录 -1 流程说明&#xff1a; 0 几个重要 函数 1、calibrateCamera()函数 2、stereoCalibrate() 3、findChessboardCorners() 棋盘格角点检测 4、stereoRectify() 5、initUndistortRectifyMap() 6、remap() 1、用于标定的图像 2、标定前 3、OpenCV进行双目标定 单…

《基于多尺度特征提取的少样本脉搏波形轮廓分类》阅读笔记

目录 一、论文摘要 二、论文十问 Q1&#xff1a;论文试图解决什么问题&#xff1f; Q2&#xff1a;这是否是一个新的问题&#xff1f; Q3&#xff1a;这篇文章要验证一个什么科学假设&#xff1f; Q4&#xff1a;有哪些相关研究&#xff1f;如何归类&#xff1f;谁是这一课…

【c++】——string类

&#x1f331;码云&#xff1a;一条咸鱼 目录 &#x1f349;string类简介&#x1f349;string类的常用接口说明&#x1f353;string类对象常见构造函数&#x1f353;string类对象常见容量操作函数&#x1f353;string类对象访问及遍历操作函数&#x1f353;string类对象修改操作…

基于springboot的4S店车辆管理系统(源码等)

摘 要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#xff0c;各行各业相继进入信息管理时代&…

【面试系列】详细拆解Java、Spring、Dubbo三者SPI机制的原理

什么是SPI SPI全称为Service Provider Interface&#xff0c;是一种动态替换发现的机制&#xff0c;一种解耦非常优秀的思想&#xff0c;SPI可以很灵活的让接口和实现分离&#xff0c;让api提供者只提供接口&#xff0c;第三方来实现&#xff0c;然后可以使用配置文件的方式来…

面向开发人员的 ChatGPT 提示语教程 - ChatGPT Prompt Engineering for Developers

面向开发人员的 ChatGPT 提示语教程 - ChatGPT Prompt Engineering for Developers 1. 指南1-1. 提示的准则1-2. 配置1-3. 提示语原则原则 1: 写出清晰而具体的指示(原文: Write clear and specific instructions)技巧 1: 使用分隔符来清楚地表明输入的不同部分(原文: Use deli…

2022年NOC大赛编程马拉松赛道初赛图形化高年级A卷-正式卷,包含答案

目录 选择题: 下载打印文档做题: 2022NOC-图形化初赛高年级A卷正式卷 选择题: 1、答案:B 俄罗斯方块是一款风靡全球的益智小游戏,玩家通过移动、旋转和摆放不同造型的方块,使其排列成完整的一行或多行。请问如何旋转图中的蓝色方块,可以使它刚好放入虚线框中,消灭方块…