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

        今天为大家带来一篇关于在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.hqwc.cn/news/21868.html

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

相关文章

线性代数的一些小细节

1 .矩阵乘法满足结合律&#xff0c;但不满足交换律。 如下图中&#xff0c;UWQ三个矩阵&#xff0c;(UW)Q 和U(WQ)的2种结合&#xff0c;证明矩阵乘法满足结合律。 AB 和BA的表达式&#xff0c;如下图中&#xff0c;相同的条件是对应的4项相同&#xff08;两个对称矩阵必然满足…

Web前端 Day 5

js初体验 使得代码可以具有某些行为 <body><button>点击我变成粉色</button><script>const btn document.querySelector(button)btn.addEventListener(click, () > {btn.style.backgroundColor pink ​})</script> </body> 效果图…

榜单!高精定位模块/系统「争夺战」,份额Top5供应商都有谁

以当前国内车企落地高速NOA采用的主流方案为例&#xff0c;普遍采用了「高精定位高精地图车端传感器」的多源融合定位策略。其中&#xff0c;在高精定位部分&#xff0c;大部分采用GNSSIMURTK的方案。 从目前的智驾系统演进来看&#xff0c;主流的仍是在L2基础上&#xff0c;通…

【JavaEE】Servlet 中常用API有哪些?前后端交互方式有哪些?

博主简介&#xff1a;想进大厂的打工人博主主页&#xff1a;xyk:所属专栏: JavaEE初阶 目录 一、Servlet 运行原理 二、Servlet常用API 2.1 HttpServlet&#xff08;抽象类&#xff09; 2.1.1. init 方法 2.1.2 service方法 2.1.3 destroy方法 三、HttpServletRequest 3.1 Ht…

win11安装virtual box和vagrant,附带centos7镜像

环境检查 1. 开启CPU虚拟化 修规bios配置 configuration -> Intel Virtual Technology 改为 enabled 2. 关闭hyper-v 以管理员启动 powershell&#xff0c;执行&#xff1a; bcdedit /set hypervisorlaunchtype off 3. 关闭wsl虚拟机 以管理员启动 powershell&#x…

桥梁监测是做什么的?桥梁结构监测方案

现代化大型桥梁是交通主干道的重要节点&#xff0c;对交通运输发展具有重大影响。然而&#xff0c;桥梁在长期使用过程中容易受到各种因素的影响&#xff0c;如自然灾害、车辆载荷、材料老化等&#xff0c;从而导致结构损伤和安全隐患。因此&#xff0c;对桥梁结构性能进行自动…

1、Redis入门与应用

Redis入门与应用 Redis的技术全景 Redis一个开源的基于键值对&#xff08;Key-Value&#xff09;NoSQL数据库。使用ANSI C语言编写、支持网络、基于内存但支持持久化。性能优秀&#xff0c;并提供多种语言的API。 我们要首先理解一点&#xff0c;我们把Redis称为KV数据库&am…

【Docker】Centos安装docker-compose

下载 直接从GitHub下载docker到本地的/usr/local/bin/目录下&#xff0c;赋予读写权限&#xff0c;检查&#xff0c;就可以使用了&#xff1b; # 下载到/usr/local/bin/docker-compose目录下 sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1…

flutter开发实战-长链接WebSocket使用stomp协议stomp_dart_client

flutter开发实战-长链接WebSocket使用stomp协议stomp_dart_client 在app中经常会使用长连接进行消息通信&#xff0c;这里记录一下基于websocket使用stomp协议的使用。 一、stomp&#xff1a;流文本定向消息协议 1.1 stomp介绍 stomp&#xff0c;Streaming Text Orientate…

微服务实例构建成 docker 镜像实例

&#x1f388; 作者&#xff1a;Linux猿 &#x1f388; 简介&#xff1a;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;Linux、C/C、云计算、物联网、面试、刷题、算法尽管咨询我&#xff0c;关注我&#xff0c;有问题私聊&#xff01; &…

8.带你入门matlab 数据统计与分析——区间参数估计 均匀分布(matlab 程序 )

1.简述 本文将涉及到数理统计的最后一个模块——参数估计&#xff0c;后续将更新的模块是多项式计算、数据插值和曲线拟合。 在讲述使用matlab来实现参数估计之前&#xff0c;有必要去了解一些基本原理。 1.离散型随机变量的极大似然估计法: (1) 似然函数 若X为离散型, 似然函数…

SQL进阶(2)——SQL语句类型 增删改查CRUD 事务初步 表关联关系 视图 +索引

目录 引出SQL语句类型1.DML数据操纵语言&#xff08;重点&#xff09;2.DQL数据查询语言&#xff08;重点&#xff09;3.DDL(Data Definition Language了解)4.DCL(Data Control Language了解)5.TCL 事务控制语言 运算符和其他函数1.运算符2.其它函数增删改查CRUD 视图索引事务1…