【Linux】第一个Linux小程序——进度条

news2024/11/16 15:41:44

        今天为大家带来一篇关于在Linux上编写的进度条小程序的博客。

正文

        我们在日常生活中使用电子产品时,经常会遇到加载的过程,这时候这些加载界面总是会附带有一些进度条,这些进度条是加载进度的可视化图形,这篇文章我们就在Linux系统下编写一个进度条,主要关注进度条程序的原理和模拟应用。

缓冲区

        在写进度条之前,我们先来了解一下关于C语言中的缓冲区的知识。

        首先我们看看下面这段代码的结果:

#include <stdio.h>
#include <unistd.h>

int main()
{
    printf("Hello world!");
    while(1) sleep(1);
    return 0;
}

        结果如下:

         我们可以发现,上面的代码并没有输出Hello world! 而是一直在睡眠,我们知道,C语言在主函数中是按照从上往下的顺序来执行语句的,那么这里为什么没有先输出而是一直在睡眠呢?

        这是C语言中的缓冲区在起作用,缓冲区可以提高CPU的效率,它是内存空间中预留的存储空间,这些存储空间用来缓冲输入或输出的数据。

  其中,缓冲区根据其对应的是输入设备还是输出设备,分为输入缓冲区和输出缓冲区。

        我们的Hello world就是被存储在输出缓冲区中,由于我们使用的输出函数 printf() 对应的缓冲类型为行缓冲,在这种情况下,填满缓冲区、有换行符'\n'或者调用fflush函数强制刷新缓冲区会立即输出。(除此之外,程序结束时也会进行刷新缓冲区)而我们写在上面的输出语句没有达成刷新缓冲区的条件,于是就产生了以上的结果。

        所以我们可以使用fflush函数强制刷新缓冲区,或者在输出的字符串之后加上'\n'来保证这种情况下的正常输出。

进度条

        我们现在正式开始编写一个进度条小程序,首先,我们先关注进度条的特点:代表进度的符号都聚集于一行并且其数量一般从左向右不断增加,而且常常会标注进度的百分比表示。

        那么我们首先实现进度条的主体部分,也就是在某一行中不断向右增长的条状物。要实现这个部分,我们需要使用到上面关于缓冲区的知识:由于进度条始终在同一行中展示(也就是字符串中没有换行),我们的每次输出都必须要刷新缓冲区。除此之外,我们进度条的每一次输出都需要使光标回车到最左侧位置,这点需要我们注意使用转义字符'\r',下面我们展示代码:

processbar.c:

#include "processbar.h"                                                                       
                                                                       
const char* lable = "|/-\\";                                                                          
char bar[NUM];  
// 这段代码显示了进度条的原理
void processbar(int speed)
{
    char bar[NUM];
    memset(bar, '\0', NUM);
    int len = strlen(lable);
    int i = 0;
    while(i <= TOP)
    {
         printf("[%-100s][%d%%][%c]\r", bar, i, lable[i%len]);
         fflush(stdout);
         bar[i++] = BODY;
         if(i < 100) bar[i] = RIGHT;
         usleep(speed);
    }
    printf("\n");
}

        这是进度条的主要函数的代码,通过上面的函数,我们可以在调用时传入进度条持续增长的速度,除了进度条的主体之外,我还在旁边添加了对应进度的百分比数字和顺时针旋转的一根杠作为修饰。最后我们输出换行防止下一命令行将我们的进度条覆盖。

processbar.h:

#pragma once                                                                                      
                                                                          
#include <stdio.h>                                                     
#include <unistd.h>                                                    
#include <string.h>                                                    
                                                                           
#define NUM 102                                                                                  
#define TOP 100                                                       
#define BODY '='                                                                         
#define RIGHT '>'                                                                                 
                                                                                                   
extern void processbar(int);

 main.c:

#include "processbar.h"  
                                                                     
int main()
{
    processbar(50000);
    return 0;
}            

        当我们得到了上述的三个文件,我们便可以编译运行在屏幕上输出想要的结果,这时我们可以使用上一篇文章中介绍的项目自动化工具——make和makefile来完成编译和清理的工作。

makefile:

processBar:processbar.c main.c
    @gcc -o $@ $^    
.PHONY:clean    
clean:    
    @rm -f processBar    

        于是我们使用make指令得到可执行文件:

[butterfly@VM-24-9-centos processbar]$ make
[butterfly@VM-24-9-centos processbar]$ ls
install.sh  main.c  Makefile  processbar  processbar.c  processbar.h

        然后我们执行得到的可执行文件:

         这样我们便运用学到的知识实现了进度条的基本原理,谢谢大家!

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

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

相关文章

基于云原生网关的全链路灰度实践

作者&#xff1a; 倪海峰&#xff08;海迩&#xff09; 前言 随着企业规模的不断扩大&#xff0c;传统单体应用已很难进一步支持业务的发展&#xff0c;业务的迭代速度已经难以满足业务的增长&#xff0c;此时企业会对应用系统做微服务化的改造&#xff0c;降低业务的耦合度&…

keepalived脑裂

keepalived脑裂及解决方法&#xff1f; 一.keepalived的脑裂是如何产生的&#xff1f;二、HAProxy1.HAProxy概念2.HAProxy主要特性3.HAProxy负载均衡策略 4.LVS nginx HAProxy的区别5.编译部署HAProxy 一.keepalived的脑裂是如何产生的&#xff1f; 脑裂&#xff1a;指在一个高…

Elasticsearch【优化、案例】(八)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch集群_测试集群状态 Elasticsearch集群_故障应对&水平扩容 Elasticsearch优化_磁盘选择 Elasticsearch优化_分片策略 Elasticsearch优化_内存设置 Elasticsearch案例_需求说明 Elasticsearch案例_ES自动补全 Elasticsearch案例_创建索引 Elastic…

多元分类预测 | Matlab 鲸鱼算法(WOA)优化xgboost的分类预测模型,多特征输入模型,WOA-xgboost分类预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 多元分类预测 | Matlab 鲸鱼算法(WOA)优化xgboost的分类预测模型,多特征输入模型,WOA-xgboost分类预测 多特征输入单输出的二分类及多分类模型。程序内注释详细,直接替换数据就可以用。程序语言为matlab,程序可…

MySQL查询作业

一、单表查询练习 1、查询出部门编号为30的所有员工 2、所有销售员的姓名、编号和部门编号。 3、找出奖金高于工资的员工。 4、找出奖金高于工资60%的员工。 5、找出部门编号为10中所有经理&#xff0c;和部门编号为20中所有销售员的详细资料。 6、找出部门编号为10中…

【三】部署zabbix-proxy代理服务器和高可用,以及监控windows系统和java应用

zabbix代理服务器和高可用 1.部署zabbix代理服务器1.1 代理端zabbix-proxy配置1.2 客户端zabbix-agent配置1.3 zabbix-proxy总结 2. 部署Zabbix高可用集群2.1 主节点zabbix-server配置2.2 备节点zabbix-server配置2.3 客户端zabbix_agent配置2.4 Zabbix高可用集群总结 3.Zabbix…

JavaScript异步编程:(回调函数、Promise、async/await、Generator)

文章目录 前言1. 回调函数1.1. 回调函数的基本概念和使用方法1.2. 回调函数的优缺点和注意事项1.3. 回调地狱和如何避免 2. Promise2.1. Promise 的基本概念和使用方法2.2. Promise 的状态和状态转换2.3. Promise 的链式调用和错误处理2.4. Promise.all 和 Promise.race 的使用…

MySQL数据库中对表进行创建,插入数据并对数据进行选择

目录 1.根据此图进行建表并插入数据 2.对表进行以下操作 a:显示所有职工的基本信息 b:查询所有职工所属部门的部门号&#xff0c;不显示重复的部门号 c:求出所有职工的人数 d:列出最高工和最低工资 e:列出职工的平均工资和总工资 f:创建一个只有职工号、姓名和参加工作的…

123.HTML5+CSS3完结_使用Netlify收取表单

Netlify也可以做表单接受&#xff1a; 我们启动一下 修改下表单 ● 接着在我们的网站输入并提交表单 ● 之后会有一个提示&#xff0c;提示我们提交成功 然后就能在Netlify接受到用户的表单 ● 当然这个表单只能接受100个&#xff0c;但是作为实验也够用了 到此&a…

文字磨练课程:提高编辑和校对效率的方法

提高编辑和校对效率&#xff0c;可以使你更有效地完成写作任务&#xff0c;提升文章质量。以下是一些方法&#xff0c;可以帮助你在编辑和校对过程中提高效率。 1.设定目标和计划 在开始编辑和校对前&#xff0c;设定明确的目标和计划。这可以帮助你集中注意力&#xff0c;提…

【SQL应知应会】表分区(一)• MySQL版

欢迎来到爱书不爱输的程序猿的博客, 本博客致力于知识分享&#xff0c;与更多的人进行学习交流 本文收录于SQL应知应会专栏,本专栏主要用于记录对于数据库的一些学习&#xff0c;有基础也有进阶&#xff0c;有MySQL也有Oracle 分区表 • MySQL版 一、分区表1.非分区表2.分区表2…

整齐有序!统一命名文件,高效管理数据轻松实现!

在数字化时代&#xff0c;我们每天都与大量文件打交道&#xff0c;文件名杂乱无章、难以辨识的情况是司空见惯的。这不仅浪费我们宝贵的时间&#xff0c;还可能导致信息混乱和数据丢失。但是&#xff0c;抛开这一切困扰吧&#xff01;现在&#xff0c;我们向您介绍一个简单却强…

C++—string类

本期我们来学习C的string&#xff0c;本期内容相当的多&#xff0c;且有一定难度&#xff0c;需要大家静下心来看 目录 1.标准库中的string 1.1string类的介绍 1.2 string类的常用接口 构造函数、析构函数、赋值、拷贝构造 npos push_back append operator[ ] size …

什么是ASPICE认证

ASPICE&#xff1a; “AutomotiveSoftware ProcessImprovement and CapacityDetermination”&#xff0c;即汽车软件过程改进及能力评定。它是一个过程模型&#xff0c;由过程和能力度两个维度构成&#xff0c;用于评价汽车行业软件设计开发的能力水平。 ASPICE的6个级别&…

基于simulink进行场景变化检测(附源码)

一、前言 此示例演示如何及时分割视频。此示例中的算法可用于检测视频流中的重大变化&#xff0c;例如广告开始和结束的时间。场景变换在广告和营销中被广泛应用。通过改变场景&#xff0c;可以吸引消费者的注意力&#xff0c;传达产品或服务的特点和优势。例如&#xff0c;将…

包揽七项葵花奖 参编多项标准 萤石领跑智能家居+物联网云平台行业

7月9日&#xff0c;2023第七届“葵花奖”智能家居评选颁奖盛典在广交会展馆举行&#xff0c;萤石网络一举斩获7项重磅奖项。同时&#xff0c;萤石作为参编单位&#xff0c;受邀参与了《智能门锁测评标准》发布仪式及《智能开关测评标准》启动会&#xff0c;再次彰显了其在智能家…

【一些随笔】浅析 Linux和Windows:系统介绍、操作差异与使用技巧解析

一些随笔 文章内容1️⃣ 那些在Linux上顺理成章&#xff0c;换到Windows上就可能令人费解的事2️⃣ Linux系统介绍及使用技巧3️⃣ Windows系统介绍及使用技巧 文章内容 Linux和Windows系统的操作差异&#xff1b;Linux系统介绍、系统监控和优化技巧、Shell脚本编程技巧、一些…

掌握Python文件操作的绝招:打造数据之径,揭开文件操作的神秘面纱

文章目录 前言文件的基本操作打开文件操作关闭文件操作对文件进行操作1&#xff09;只读文件操作read()readlines()readline()seek() 2&#xff09;只写文件操作3&#xff09;文件追加操作读写、追加读写操作1. r 模式打开文件2. w 模式打开文件3. a 模式打开文件 以二进制的形…

走向 Native 化:SpringDubbo AOT 技术示例与原理讲解

作者&#xff1a;刘军 Java 应用在云计算时代面临“冷启动”慢、内存占用高、预热时间长等问题&#xff0c;无法很好的适应 Serverless 等云上部署模式&#xff0c;GraalVM 通过静态编译、打包等技术在很大程度上解决了这些问题&#xff0c;同时针对 GraalVM 的一些使用限制&a…

用了国产接口管理神器 Apifox 之后,我果断从 Postman “脱坑”了

在当前行业发展背景下&#xff0c;绝大部分项目都是基于前后端分离的架构进行的&#xff0c;由前后端、测试、运维等不同的团队共同开发&#xff0c;那么团队之间能否很好的 协同合作 无疑直接决定着项目的最终效果。 但是在实际开发流程中&#xff0c;团队之间的协同是很低效…