当前位置: 首页 > news >正文

Linux代码初试__进度条

前言   

        在我们的日常生活中,进度条是十分常见的,比如在软件下载中,应用加载中等等~~~那么进度条有什么特点?他又如何实现。

下面我们将结合下面的图展开讲解

一、前置理论知识

1.1回车和换行的区别 

在我们的日常生活中,回车和换行似乎是相同的事情,但是事实上

  • 回车:光标回到当前行的左端
  • 换行:跳转到当前的下一行
  • 在C语言中"\n"表示回车加换行,"\r"单单指的是回车;

PS:现在我们键盘上的ENTER同时兼备了回车和换行的功能

我们可以看到在老式的键盘中回车键的符号和对应的形状都是一个先向下再向左的箭头。也就是说这一个键同时实现了两个功能。

1.2缓存区的概念

在C语言中,缓存区是一种存储空间,用于存储程序中经常使用的变量和数据。缓存区的目的是提高程序的运行速度,当程序需要访问一个变量或数据时,处理器会先检查缓存区中是否存在该数据的副本,如果存在,则直接访问缓存区中的数据,而不是从内存中读取。这样可以减少内存访问次数,提高程序的执行速度。

在C语言中会默认打开三个输入输出的文件,分别是标准输入流stdin,标准输出流stdout,标准错误stderr。

在我们平时的程序中,从程序中输出的数据或者键盘上读取的数据会先存到一个缓存区中,在需要时经行读取和截断。(比如:在printf函数调用中输入带有空格的字符串,空格后的数据未被访问,存入缓存区)

1.2.1“\n”和“\r”在缓冲区中的作用效果差别

  • 在Linux中我们经常说一句话:万物皆文件。也就是Linux系统认为显示器是文件,键盘是文件。在我们使用printf函数会将缓存区的数据读取到显示器上。
  • 要注意的是显示器默认是行刷新,也就是当输出内容配上“\n”后会直接回车+换行并立刻将内容打印在屏幕上,待睡眠结束后,才会弹出操作框;

  • 而当输出内容配上“\r”后,其会先输出到缓冲区中,待睡眠结束后才会和操作框一起输出
 printf("hello Makefile!\n");先行打印,待睡眠结束后才弹出操作框printf("hello Makefile!\r");待睡眠结束后才会和操作框一起打印

1.2.2fflush函数

  • fflush是一个在C语言标准输入输出库中的函数,功能是冲洗流中的信息,该函数通常用于处理磁盘文件。fflush()会强迫将缓冲区内的数据写回参数stream 指定的文件中。
  • 在下面代码块中,"hello Makefile!"本来应该待睡眠结束后才会和操作框一起弹出,在此之前存储在缓冲区中;但我们用了fflush(stdout);(stdout是其数据类型),直接将内容从缓冲区中写回显示器文件中;
  • 最终完成的效果是:先行打印,待睡眠结束后才弹出操作框
#include <stdio.h>
int main()
{printf("hello Makefile!\r");fflush(stdout);sleep(3);return 0;
}

 二、Linux中的先行配置

在Linux中我们一般使用gcc命令去完成代码的预处理、编译、汇编、连接的工作。而对于一个多文件形成的程序我们通常使用Linux项目自动化构建工具-make/Makefifile。可以说会不会写makefile反映出一个人有无能力去完成大型工程的能力。

虽然进度条只由三个文件组成但是这不失为一种练习vim,makefile的手段。

  • 用vim分别建立【main.c】【makefile】【processbar】【processBar.c】【processbar.h】,可视具体情况设置,文末有简略代码;
  • makefile文件如图所示

> - ./processbar 执行程序

三、进度条的重点部分

1、设计进度条的主体部分

这里我们单独实现进度条功能,所以我们需要一个东西来模拟下载的速度从而让进度条以可以被观测的方式来实现。

sleep/usleep(time)让程序休眠time秒。每次休眠结束后更新进度条,在运行时就像进度条真的在加载什么。


将进度条显现在屏幕上我们一般会用printf函数,那么我们究竟需要展现什么?

以这个为例,我们需要一条代表下载进度的线,表示已经下载的百分比和一些动态的符号表示程序的进行。

进度线:一个大小为102char数组(预留两个位置放"\0")

百分比:一个int变量

动态符号:一个固定的字符串比如:| / - \,然后在

那么我们的初代主体代码为

void processbar(int speed)
{char bar[102];const char *lable="|/-\\";memset(bar, '\0', sizeof(bar));int len =strlen(lable);int cnt=0;while(cnt <= 100){   printf("[%-100s][%d%%][%c]\r", bar, cnt, lable[cnt%len]);fflush(stdout); bar[cnt++]=BODY;if(cnt<100)bar[cnt]='>';usleep(speed);}printf("\n");
}
这里注意两点一是 ‘ / ’ 的表示和‘ % ’ 的表示。

但是现实情况大多是传入进度来显示进度条。

所以我们将代码经行些许修改。 

四、完整代码

#include"processbar.h"
#include <string.h>
#include <unistd.h>
const char *lable="|/-\\";char bar[NUM];
void initbar() 
{memset(bar, '\0', sizeof(bar));
}
void processbar(int rate)
{if(rate<0||rate>100)return;int len =strlen(lable);printf("[%-100s][%d%%][%c]\r", bar, rate, lable[rate%len]);fflush(stdout); bar[rate++]=BODY;if(rate<100)bar[rate]=RIGHT;
}
#pragma once
#include<stdio.h>
#define NUM 102//预留两个位置放\0
#define TOP 100
#define BODY '-'
#define RIGHT '>'
extern  void processbar(int speed);
extern void initbar();
#include"processbar.h"
#include<unistd.h>
typedef void(*callback_t)(int);
//模拟下载
void downLoad(callback_t cb)
{initbar();int total = 100;//100mbint curr = 0;//0mbwhile(curr <= total){usleep(10000);//模拟下载时间int rate=curr*100/total;cb(rate);curr++;}printf("\n");
}int main()
{downLoad(processbar);return 0;
}

相关文章:

Linux代码初试__进度条

前言 在我们的日常生活中&#xff0c;进度条是十分常见的&#xff0c;比如在软件下载中&#xff0c;应用加载中等等~~~那么进度条有什么特点&#xff1f;他又如何实现。 下面我们将结合下面的图展开讲解 一、前置理论知识 1.1回车和换行的区别 在我们的日常生活中&#x…...

美国访问学者签证有哪些要求?

近年来&#xff0c;越来越多的学者选择前往美国进行访问学者签证&#xff0c;以便深入研究、学术交流以及开展合作项目。美国访问学者签证是一个重要的工具&#xff0c;为学者们提供了在美国学术机构进行短期或长期学术活动的机会。下面知识人网将介绍一些申请美国访问学者签证…...

如何利用客户旅程打造好的用户体验?

在当今竞争激烈的市场中&#xff0c;提供卓越的用户体验已经成为企业脱颖而出的关键因素之一。客户旅程是实现出色用户体验的有力工具之一&#xff0c;而HubSpot的客户旅程规划功能为企业提供了强大的支持&#xff0c;帮助他们更好地理解、管理和改善客户的互动过程。今天运营坛…...

数据治理-数据质量-1

为什么要保证数据质量 有效的数据管理涉及一系列复杂的、相互关联的过程&#xff0c;它使组织能够利用他们的数据来实现战略目标。数据管理能力包含各个方面&#xff0c;但最重要的要实现数据价值&#xff0c;而实现数据价值的前提是数据本身是可靠和可信的&#xff0c;换句话说…...

第 3 章 栈和队列 (循环队列)

1. 背景说明 和顺序栈相类似&#xff0c;在队列的顺序存储结构中&#xff0c;除了用一组地址连续的存储单元依次存放从队列头到队列尾的元素之外&#xff0c; 尚需附设两个指针 front 和 rear 分别指示队列头元素及队列尾元素的位置。约定&#xff1a;初始化建空队列时&#x…...

boost::any 与 boost::any_cast

在boost库中&#xff0c;boost::any 与 boost::any_cast的使用方法是什么&#xff1f;设计宗旨是什么&#xff1f;他们与模板有什么区别&#xff1f; 在Boost库中&#xff0c;boost::any和boost::any_cast用于处理类型安全的任意类型值的存储和检索。 使用方法&#xff1a; …...

go 、rust、python 语言 编码效率、性能比较

1、 Rust适合内存使用苛刻、无GC、超高性能的场景&#xff0c; 如果是实时计算系统&#xff0c;那rust的吞吐量对于Go还是有一定优势的&#xff0c;基于线程和goroutine的调度模式还是有差别的。能用他的都是高手&#xff0c;代码量大&#xff0c;内存占用不高&#xff0c; 20…...

怎么把pdf转换成高清图片?

怎么把pdf转换成高清图片&#xff1f;最近&#xff0c;我的同事遇到了一个问题&#xff0c;现在她需要将一些pdf文件转换成高清的图片&#xff0c;这件事情让让她感到非常无助&#xff0c;因为她非常着急需要将这些文件转换为图片格式&#xff0c;以便更好的在今后的工作中进行…...

尚硅谷大数据项目《在线教育之离线数仓》笔记006

视频地址&#xff1a;尚硅谷大数据项目《在线教育之离线数仓》_哔哩哔哩_bilibili 目录 第11章 数仓开发之ADS层 P087 P088 P089 P090 P091 P092 P093 P094 P095 P096 P097 P098 P099 P100 P101 P102 P103 P104 P105 P106 P107 P108 P109 P110 P111 …...

企业架构LNMP学习笔记2

企业架构分布式集群最终解决方案 集群&#xff1a;多台服务器在一起做同样的事情。 分布式&#xff1a;多台服务器在一起做不同的事情。 最终架构&#xff1a;实现负载均衡LB&#xff0c;高可用HA&#xff0c;数据库主从复制M-S&#xff0c;读写分离R-W&#xff0c;缓存中间件…...

AI「反腐」,德国马普所结合 NLP 和 DNN 开发抗蚀合金

内容一览&#xff1a;在被不锈钢包围的世界中&#xff0c;我们可能都快忘记了腐蚀的存在。然而&#xff0c;腐蚀存在于生活中的方方面面。无论是锈迹斑斑的钢钉&#xff0c;老化漏液的电线&#xff0c;还是失去光泽的汽车&#xff0c;这一切的发生都与腐蚀有关。据统计&#xf…...

9-AJAX-2综合案例

AJAX-综合案例 目录 案例-图书管理图片上传案例-网站换肤案例-个人信息设置 学习目标 今天主要就是练&#xff0c;巩固 axios 的使用 完成案例-图书管理系统&#xff08;增删改查&#xff09;经典业务掌握图片上传的思路完成案例-网站换肤并实现图片地址缓存完成案例-个人信…...

力扣:86. 分隔链表(Python3)

题目&#xff1a; 给你一个链表的头节点 head 和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有 小于 x 的节点都出现在 大于或等于 x 的节点之前。 你应当 保留 两个分区中每个节点的初始相对位置。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09;…...

联合教育部高等学校科学研究发展中心,阿依瓦科技创新教育专项正式发布!

7 月 24 日&#xff0c;教育部科技发展中心官网发布了《中国高校产学研创新基金&#xff0d;阿依瓦科技创新教育专项申请指南》。 针对高校在人工智能、智能制造、智慧校园、大数据等领域科研和教研的创新研究&#xff0c;教育部高等学校科学研究发展中心与阿依瓦(北京)技术有…...

Ubuntu入门05——磁盘管理与备份压缩

1.检查磁盘空间占用情况 2.统计目录或文件所占磁盘空间大小 3.压缩 3.1 zip、unzip和zipinfo 运行时发现上面命令不成功&#xff0c;换成&#xff1a; &#xff08;将文件lkw放入压缩文件lkw01.zip中&#xff09; sudo zip -m lkw01.zip lkw 解压文件&#xff1a; 实操&…...

[github-100天机器学习]day4+5+6 Logistic regression

https://github.com/MLEveryday/100-Days-Of-ML-Code/blob/master/README.md 逻辑回归 逻辑回归用来处理不同的分类问题&#xff0c;这里的目的是预测当前被观察的对象属于哪个组。会给你提供一个离散的二进制输出结果&#xff0c;一个简单例子&#xff1a;判断一个人是否会在…...

【菜鸡学艺–Vue2–001】模板语法声明式渲染

【菜鸡学艺–Vue2–001】模板语法&声明式渲染 &#x1f996;我是Sam9029&#xff0c;一个前端 Sam9029的CSDN博客主页:Sam9029的博客_CSDN博客-JS学习,CSS学习,Vue-2领域博主 **&#x1f431;‍&#x1f409;&#x1f431;‍&#x1f409;恭喜你&#xff0c;若此文你认为写…...

LabVIEW开发感应电机在线匝间短路故障诊断系统

LabVIEW开发感应电机在线匝间短路故障诊断系统 工业中使用的超过85%的电动机是三相感应电动机。它们因其可靠性、设计便利性、高性能和过载能力而被广泛用于不同的应用&#xff0c;例如制造、加工、电力系统、运输等。无论它们的能力如何&#xff0c;它们都被认为是现代工业学…...

Deepin / UOS 安装自带的Qt

Deepin / UOS 安装自带的Qt 安装Qt版本可从官网下载也可以使用Deepin / UOS 自己维护的Qt版本&#xff0c;好处是针对Deepin/UOS系统进行了针对性的优化&#xff0c;比如QtCreator的界面和系统UI保持一致。 查询Qt版本及是否安装 sudo apt policy qtbase5-devsudo apt polic…...

vite+vue3+element-plus

vitevue3element-plus 1.开始 npm create vitelatest app -- --template vuenpm installlnpm run dev2.引入element-ui npm install element-plus修改main.js import ElementPlus from element-plus import element-plus/dist/index.css createApp(App).use(ElementPlus).m…...

在rocky linux 9.5上在线安装 docker

前面是指南&#xff0c;后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

dify打造数据可视化图表

一、概述 在日常工作和学习中&#xff0c;我们经常需要和数据打交道。无论是分析报告、项目展示&#xff0c;还是简单的数据洞察&#xff0c;一个清晰直观的图表&#xff0c;往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server&#xff0c;由蚂蚁集团 AntV 团队…...

华为OD机考-机房布局

import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

HTML前端开发:JavaScript 获取元素方法详解

作为前端开发者&#xff0c;高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法&#xff0c;分为两大系列&#xff1a; 一、getElementBy... 系列 传统方法&#xff0c;直接通过 DOM 接口访问&#xff0c;返回动态集合&#xff08;元素变化会实时更新&#xff09;。…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...

Modbus RTU与Modbus TCP详解指南

目录 1. Modbus协议基础 1.1 什么是Modbus? 1.2 Modbus协议历史 1.3 Modbus协议族 1.4 Modbus通信模型 🎭 主从架构 🔄 请求响应模式 2. Modbus RTU详解 2.1 RTU是什么? 2.2 RTU物理层 🔌 连接方式 ⚡ 通信参数 2.3 RTU数据帧格式 📦 帧结构详解 🔍…...

Axure 下拉框联动

实现选省、选完省之后选对应省份下的市区...