Linux小程序——进度条

前言:哈喽小伙伴们,经过我们对多个Linux基本开发工具的学习之后,对于Linux的使用也算是更上一层楼。

所以这篇文章,我们就尝试使用我们学过的Linux知识来写一个小程序——进度条,达到实践以及加深知识映像的效果


目录

 一.什么是进度条

二.缓冲区

三.简易倒计时

四.进度条

五.完整代码展示

1.Progressbar.h

2.Progressbar.c

总结


 一.什么是进度条

 进度条相信大家都不陌生,平时玩游戏的时候都会有数据加载进度条。那么你知道进度条的原理是什么吗???

我们先来认识两个符号:

\n:换行符,从头开始另起一行

\r:回车符,使光标回到本行的开头 


二.缓冲区

首先我们要知道,在程序文件的加载过程中,不是一路顺风的,经常会出现卡顿和进度突然变快和变慢的情况,这就要关系到缓冲区的概念了。

大家一定都认识sleep()睡眠函数,使用它需要包含头文件#include<unistd.h>,它的作用是能够让程序在某个位置停留一定时间后再继续运行,下面我们就来展示一下:

我们设置睡眠时间为3秒,然后运行:

能够看出,printf函数打印完之后,程序并没有立刻停止,而是停留了一段时间再结束。 

 现在同样的代码,我只修改一个地方:将“\n”换行符去掉,我们在运行一次:

会发现初始的时候什么都没有,过3秒之后才将结果打印并退出。 

这是为什么呢???

实际上,我们的printf函数所输出的数据一开始是存放在缓冲区的,缓冲区里的数据会在程序结束时才会被冲刷并打印在显示器上,而这里的sleep函数的作用就是让程序睡眠一定时间后再终止所以“hello linux”才会过3秒后才打印

但是有一种特殊情况就是“\n”,它能够立即刷新一次缓冲区从而让包括它在内的之前的所有数据立即打印

除此了“\n”之外,还有一个函数可以主动冲刷缓冲区,它就是fflush(),给他传入形参stdout


三.简易倒计时

学习完缓冲区的知识之后,我们就能够制作一个简易的倒计时了,直接来看代码:

通过while循环打印,我们使用\r回车符每打印一次之后就让光标回到行头但是这样会造成覆盖,导致我们的倒计时无法显示,所以我们需要使用fflush强制将倒计时打印出来,并使用sleep使打印的间隔为1秒,实现倒计时:

 

由于不方便录视频,所以我们展示两张截图作为参考。 


四.进度条

在linux写一个独立项目,我们同样需要按照C/C++的方式来,一个头文件,两个源文件

唯一值得注意的是,这次我们要多写一个makefile文件,帮助我们执行指令

 

想要多文件同时操作,不要忘记vim的操作方式:在底行模式下输入vs + 文件名,再通过ctrl+ww,可以使光标在不同文件中移动。 

下面我们通过一步一步分析来写代码,完成进度条的制作过程:

 我们要先将所有文件的基本代码编写完成

并进行测试:

确认无误后,我们就可以只对Progressbar.h和Progressbar.c两个文件进行编辑了

首先我们要知道,进度条基本都是通过特殊字符来表示的,这里我们用‘#’字符来当做进度条

其次,进度条的加载过程,就像上边的倒计时一样需要循环,而且字符是逐渐增加的,这样我们就可以考虑使用字符数组了。如果是100%加载的话,那么数组的长度就要是100

那么为了方便日后我们更换进度条的符号以及数组的大小,我们都使用宏定义

#define type #

#define Length 100

创建完数组之后,如果我们不初始化的话,则会默认附随机值,影响我们打印,所以我们可以使用memset将数组元素均赋值为‘\0’,使用memset需要头文件#include<string.h>

char bar[length];
memset(bar,'\0',sizeof(bar));  

 随后我们就可以进行循环打印:

int count = 0;
while(count <= Length)
{
    printf("[%-100s][%d%%]\r",bar,count);
    fflush(stdout);
    bar[count++] = type;
    usleep(500000);
}

除了printf里边的代码,其他的相信小伙伴们都能够理解,下面我们就来仔细讲解一下printf

我们要打印的,也就两个东西,一是进度条,二是显示已经加载了多少的百分比数字

这个进度条,我们用“[]”来括起来,而且我们希望这个“[]”已经是固定的长度,随后让“#”去一点点增长,所以我们需要在%s中间加一个-100,也就是数据向右空出100个空格

然后就是百分比数字显示,我们就直接打印count,这里要注意一下如果想要打印出“%”,就需要使用“%%”

初始情况下,bar数组为空,然后每打印一次,就将bar数组的一个元素改为“#”。

由于sleep函数只能睡眠整数秒,但是睡眠100时间又太长,所以我们使用usleep()微秒睡眠函数,其中1*1000*1000为1秒,所以我们睡眠0.5秒则传参500000。

如此循环100次,便可实现进度条:


五.完整代码展示

1.Progressbar.h

#pragma once

#include<stdio.h>
#include<string.h>                                                                                                                                 
#include<unistd.h>
#define type '#'
#define Length 100

void Probar(); 

2.Progressbar.c

#include"Progressbar.h"
void Probar()
{
   char bar[Length];
   memset(bar,'\0',sizeof(bar));

   int count = 0;
   while(count <= Length)
   {
       printf("[%-100s][%d%%]\r",bar,count);
       fflush(stdout);
       bar[count++] = type;
       usleep(500000);
   }

   printf("\n");
}

总结

简易的进度条的制作过程就分享到这里啦,希望能够让小伙伴们对linux开发工具的使用更进一步,同时在Linux上编程也更加顺手。

最后还是要记得一键三连哦,我们下期再见!

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

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

相关文章

智能文档处理技术综述

一、 智能文档处理介绍 智能文档处理&#xff08;Intelligent Document Processing, IDP&#xff09;是利用人工智能&#xff08;AI&#xff09;、机器学习&#xff08;ML&#xff09;、计算机视觉&#xff08;CV&#xff09;、自然语言处理&#xff08;NLP&#xff09;等技术…

POJ3037 + HDU-6714

两道最短路好题 POJ3037 手玩一下 发现每一点的速度可以直接搞出来&#xff0c;就是pow(2,h[1][1]-h[i][j])*V 那么从这个点出发到达别的点的耗费的时间都是上面这个数的倒数&#xff0c;然后直接跑最短路就好了 #include<iostream> #include<vector> #include<…

BeanPostProcessors是什么以及如何使用?

目录 一、BeanPostProcessors是什么&#xff1f;二、如何使用 BeanPostProcessor1、实现 BeanPostProcessor 接口2、注册 BeanPostProcessor3、示例代码 三、使用场景四、注意事项 一、BeanPostProcessors是什么&#xff1f; BeanPostProcessor 是 Spring 框架提供的一个扩展点…

Java多线程实战-从零手搓一个简易线程池(一)定义任务等待队列

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️本系列源码仓库&#xff1a;多线程并发编程学习的多个代码片段(github) &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正…

每日一题——LeetCode1748.唯一元素的和

方法一 两次遍历 var sumOfUnique function(nums) {let map new Map()for(let num of nums){map.set(num,map.has(num)?map.get(num)1:1)}let res0for(let num of nums){if(map.get(num)1) resnum}return res }; 消耗时间和内存情况&#xff1a; 方法二 一次遍历 var su…

新书速递——《可解释AI实战(PyTorch版)》

本书旨在帮助你实施最新的可解释AI技术&#xff0c;以构建公平且可解释的AI系统。可解释AI是当今AI研究中的热门话题&#xff0c;但只有少数资源和指南涵盖了所有重要技术&#xff0c;这些技术对实践者来说非常有价值。本书旨在填补这一空白。 本书读者对象 本书既适合那些有兴…

揭秘神秘商业模式:看似赔钱的买卖,如何月赚600万?

你是否曾被一个看似赔钱的买卖所吸引&#xff0c;最终却惊喜地发现它一个月竟然能赚600多万&#xff1f;这样的数字&#xff0c;是否让你感到意外又好奇&#xff1f;如果你仔细品味我们今天的内容&#xff0c;我相信&#xff0c;你也能开启属于自己的赚钱之路。 他们是如何实现…

自学编程的六种方法,你必须知道

随着互联网日趋迅猛&#xff0c;编程已经在我们生活当中无处不在了。众所周知&#xff0c;程序员的工资都很不错&#xff0c;于是越来越多的人&#xff0c;都想加入到编程的行业中来。那么如何加入到程序员的行业当中&#xff1f; PHP从入门到放弃&#xff0c;C语言从入门到放…

【CSDN活动】程序员职业生涯的分水岭:年龄还是经验?

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 程序员职业生涯的分水岭&#xff1a;年龄还是经验&#xff1f;引言技术更新换代…

基于nodejs+vue在线学籍管理系统python-flask-django-php

系统开发主要在 Windows 系统下进行&#xff0c;采用支持跨平台的nodejs语言开发完成&#xff0c;因此可以运行在任意开发环境下。系统采用mysql数据库的方式&#xff0c;按照express框架进行开发。 前端技术&#xff1a;nodejsvueelementui, Express 框架于Node运行环境的Web框…

windows10彻底关闭Windows Defender的4种方法

Windows Defender是windows10系统自带的杀毒软件。默认情况下它处于打开的状态。大多数第三方的杀毒软件都可以识别&#xff0c;并代替它。 但是大多数情况下&#xff0c;我们总是有各种理由需要关闭它&#xff0c;例如 Windows Defender 导致资源使用率高或系统出现其他问题&…

蓝桥杯小白月赛3.23

题目描述&#xff1a; AC代码&#xff1a; #include <iostream> #include<cstring> #include<algorithm>using namespace std;const int N 2e510; string str[N]; //写上&会速度更快一些 bool cmp(const string &s1,const string &s2) {//例…

HTML5+CSS3+JS小实例:原生JS实现全屏滚动

实例:原生JS实现全屏滚动 技术栈:HTML+CSS+JS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial…

【JVM】JVM简介

文章目录 &#x1f334;简介&#x1f332;JVM发展史&#x1f338;Sun Classic VM&#x1f338;Exact VM&#x1f338;HotSpot VM&#x1f338;JRockit&#x1f338;J9 JVMTaobao JVM&#xff08;国产研发&#xff09; &#x1f333;JVM 运行流程⭕总结 &#x1f334;简介 JVM …

win10 禁止谷歌浏览器自动更新(操作贼简单)

禁止谷歌浏览器自动更新 &#xff08;1&#xff09;修改 "C:\Windows\System32\drivers\etc\hosts 文件&#xff0c;在最后增加 127.0.0.1 update.googleapis.com&#xff08;2&#xff09;保存后&#xff0c;winr 快捷键&#xff0c;输入cmd &#xff0c;打开命令行 &am…

学习笔记:MYSQL数据库基础知识

MYSQL数据库基础知识学习笔记 MYSQL基础学习数据库相关概念现主流数据库排名数据模型SQL分类SQL数据库基础操作 2024/3/27 学习资料&#xff1a;黑马程序员:MYSQL MYSQL基础学习 数据库和数据库管理系统(DBMS) 数据库: 是存储数据的集合&#xff0c;包括表、视图、索引等对象…

华为数通方向HCIP-DataCom H12-821题库(多选题:201-220)

第201题 以下关于BGP中Orginator ID属性的描述,正确的是哪些项? A、Originator ID属于公认任意属性 B、当其他BGP Speaker接收到这条路由的时候,将比较收到的0nginator ID和本地的Router ID,如果两个ID相同BGP Speaker会忽略掉这条路由,不做处理 C、当一条路由第一次被RR…

Android客户端自动化UI自动化airtest从0到1搭建macos+demo演示

iOS客户端自动化UI自动化airtest从0到1搭建macosdemo演示-CSDN博客 一、基础环境 1. 安装jdk 选择jdk8 如果下载高版本 可能不匹配会失败 下载.dmg文件 苹果电脑 &#xff5c; macOS &#xff5c; jdk1.8 &#xff5c; 环境变量配置_jdk1.8 mac-CSDN博客 Java Downloads …

STM32学习笔记(6_6)- TIM定时器的输入捕获模式测频率和PWMI模式测频率占空比代码

无人问津也好&#xff0c;技不如人也罢&#xff0c;都应静下心来&#xff0c;去做该做的事。 最近在学STM32&#xff0c;所以也开贴记录一下主要内容&#xff0c;省的过目即忘。视频教程为江科大&#xff08;改名江协科技&#xff09;&#xff0c;网站jiangxiekeji.com 现在开…

狄仁杰审判周二杀妻案,这种推理办案效果果然神奇!

狄仁杰审判周二杀妻案&#xff0c;这种推理办案效果果然神奇&#xff01; 江西彭泽县小南村&#xff0c;是一个只有几十户人家的小山村&#xff0c;背靠大山&#xff0c;面对腾水。在一户人家门前&#xff0c;站满了衙役捕快和看热闹的村民。 这家的男主人叫周二。狄仁杰走进…