Linux小程序之进度条

 > 作者简介:დ旧言~,目前大二,现在学习Java,c,c++,Python等
> 座右铭:松树千年终是朽,槿花一日自为荣。

> 目标:自己能实现进度条

> 毒鸡汤:

> 望小伙伴们点赞👍收藏✨加关注哟💕💕 

🌟前言

        咱们学习这么久的指令,一句话来概括,都忘光咯,学个锤锤😟😟😟,感觉白学了,博主也是感同身受,毕竟没有相应的练习,很容易遗忘,咱们只要记住主要的指令就可以了,忘了或者不熟咱就查查文档。今天捏我们用我们所学的知识编写一个进度条,看看下面:

QQ录屏20231129162350

 ⭐前景知识一:\r和\n的理解

        C语言会提供一些特殊的字符,比如说我们常用的\n,这个字符大家都不陌生,不就是换行嘛,这个我懂,但是还有一个字符\r,这个字符的作用是回车的意思。在这块就有人说不都是一个意思嘛🤔,敲敲这些老铁们的头🙈,当然不可能是一个意思。

🌙理解字符含意

\r(回车):

  • 就是在第二行让光标跳到最开始的位置,这个操作就是回车。

\n(换行):

  • 让光标从第一行跳到第二行,但是光标只是垂直向下跳,并没有在第二行的开始。这个操作就是换行。

直接说字符的意思就有一点抽象,咱们来个代码看看👻👻👻

🌙代码理解字符

\n(换行):代码

#include<stdio.h>

int main()
{
   printf("hello world\n");

   return 0;

}

\r(回车):代码

#include<stdio.h>

int main()
{
   printf("hello world\r");

   return 0;

}

基于上面的原因我这不讲解,在后面的缓冲区里面我们详细讲解。

 ⭐前景知识二:认识缓冲区

这里我们要知道什么是缓冲区,咱可以看看官方用语:缓冲区处理 - Windows drivers | Microsoft Learn

简单来讲就是:

  • 在内存中预留了一块空间,用来缓冲输入或输出的数据,这个保留的空间被称为缓冲区。

🌙回顾回车和换行

咱们再看看这两张图片:

我们知道用 \n 的话就可以打印出来,而 \r,不能打印出来。

  • 由于显示器模式是行刷新缓冲区是按行缓冲的,没有\n,就不能立即刷新。
  • 由于\r 回到行首后,会进行覆盖写,shell 提示符会覆盖掉之前写的 “hello world”。

🌙sleep和ffush理解

        使用这个函数是在<unistd.h>库中,使用它们需要包含头文件 #include <unistd.h>,这里和缓冲区有什么关系🧐,因为在进度条中需要用到这两函数。

咱们先看这些个函数的作用

  • sleep:休眠函数,单位是秒。
  • usleep:休眠函数,单位是ms(10﹣6 )
  • fflush:刷新缓冲区

咱们来个简单的代码看看这些函数作用:

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

int main()
{
   printf("hello world\r"); 
   //刷新缓冲区
   fflush(stdout);
   printf("\n");
   //休眠三秒
   sleep(3);
   return 0;

}

 ⭐前景知识三:简单倒计时

实现进度条咱们得先实现一下简单的倒计时,为了给进度条铺垫,简单来讲就是当炮灰。

效果演绎:

全部代码:

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

int main()
{
   int cnt = 10;
   while(cnt >= 0)
   {
       printf("%-2d\r",cnt);
       fflush(stdout);
       sleep(1);
       cnt--;
   }
   printf("\n");
   return 0;
}

过程分析:

  • 定义倒计时变量 cnt,让其逐渐递降。
  • 核心就是用 \r 回到缓冲区行首进行覆盖写,然后fflush不断刷新出出来。
  • 格式调整,打印 cnt==10 时,在缓冲区打印的其实是字符1和字符0,如果我们不用 2d% 来调整格式,而用 d% 的话,那么覆盖写只会覆盖第一位字符 1 11 的位置,而第二位的字符 0 00, 还留在缓冲区原来的位置,于是倒计时便会变为下面这样
      10->90->80->70->60->50->40->30->20->10->00 ,-2d% 加个负号保证其向左对齐
  • 倒计时完加个 \n符,shell 提示符就不会出现在倒计时后面。

 ⭐进度条过程分析

原理:其原理就是不断地覆盖,然后将其像早以前的动画片一样,变成一个动画。

  • 第一个中括号就是表示进度条。
  • 第二个中括号表示进度。
  • 第三个表示旋转样式。

QQ录屏20231129162350

game.h

#include<stdio.h>
#include<time.h>
#include<unistd.h>
 
void game(double rate);
void download();

game.c

#include"game.h"
#define MAX 1024*1024*1024
 
char* buff = "|/-\\";
int i = 0;
char arr[102] = { 0 };
void game(double rate)
{
	if (rate <= 1.0)
	{
		arr[0] = '=';
	}
	printf("[%-100s][%.1lf%%][%c]\r", arr, rate, buff[i % 4]);
	fflush(stdout);
	arr[(int)rate] = '=';
	if (rate< 99.0)
	{
		arr[(int)rate+1] = '>';
	}
	i++;
}
 
void download()
{
	srand(time(NULL)^1023);
	int max = MAX;
	int cnt = 0;
	double rate = 0;
	while (rate<100.0)
	{
		cnt+= rand() % (1024*1024);
		rate = ((cnt*1.0)/max)* 100;
		if (rate > 100)
		{
			rate = 100;
		}
		game(rate);
		usleep(50000);
	}
}

test.c

​
#include"game.h"
 
int main()
{
	download();
	return 0;
}

​

makefile

all:test.o game.o
	gcc -o $@ $^

test.o:test.c
	gcc -c -o $@ $^

game.o:game.c
	gcc -c -o $@ $^

.PHONY:clean
clean:
	rm -rf *.o all

​

  🌟结束语

       今天内容就到这里啦,时间过得很快,大家沉下心来好好学习,会有一定的收获的,大家多多坚持,嘻嘻,成功路上注定孤独,因为坚持的人不多。那请大家举起自己的小说手给博主一键三连,有你们的支持是我最大的动力💞💞💞,回见。

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

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

相关文章

MySQL主从复制架构

MySQL主从复制架构 一、MySQL集群概述 ##1、集群的主要类型 高可用集群&#xff08;High Available Cluster&#xff0c;HA Cluster&#xff09; 高可用集群是指通过特殊的软件把独立的服务器连接起来&#xff0c;组成一个能够提供故障切换&#xff08;Fail Over&#xff09…

【Hadoop】集群资源管理器 YARN

一、yarn 简介 Apache YARN (Yet Another Resource Negotiator) 是 hadoop 2.x 引入的分布式资源管理系统。主要用于解决 hadoop 1.x 架构中集群资源管理和数据计算耦合在一起&#xff0c;导致维护成本越来越高的问题。 yarn主要负责管理集群中的CPU和内存 用户可以将各种服…

[ISCTF2023] Crypto/PWN/Reverse

最近新生赛还挺多&#xff0c;不过这个开始后注册页面就被删了&#xff0c;没注册上。拿别人的附件作了下。 Crypto 七七的欧拉 这题只给了n,e,c这种情况一般正常没法解&#xff0c;猜n不正常 import gmpy2 import libnum from crypto.Util.number import *flagbISCTF{****…

C++ day44完全背包问题 零钱兑换Ⅱ 组合总和Ⅳ

完全背包&#xff1a;一个物品可以使用无数次&#xff0c;将01背包中倒序遍历背包变成正序遍历背包 遍历顺序&#xff1a;在完全背包中&#xff0c;对于一维dp数组来说&#xff0c;其实两个for循环嵌套顺序是无所谓的&#xff01; 先遍历物品&#xff0c;后遍历背包可以&#…

docker搭建rabbit集群

1.去rabbitMQ官网拉去images 我当前使用的是最新版本的镜像&#xff1a;rabbitmq:3.12-management 2.创建一个集群专用网络 docker的容器相互隔离是不可通信的&#xff0c;我们自行创建一个网络后&#xff0c;创建容器时 给他们放在一起&#xff0c;就可以通信了。 docker netw…

2023年【安全员-A证】考试题及安全员-A证最新解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 安全员-A证考试题考前必练&#xff01;安全生产模拟考试一点通每个月更新安全员-A证最新解析题目及答案&#xff01;多做几遍&#xff0c;其实通过安全员-A证模拟考试题很简单。 1、【多选题】下列关于高处作业吊篮叙…

基于深度学习的点云三维目标检测方法综述

论文标题&#xff1a;基于深度学习的点云三维目标检测方法综述 作者&#xff1a;郭毅锋&#xff11;&#xff0c;&#xff12;†&#xff0c;吴帝浩&#xff11;&#xff0c;魏青民&#xff11; 发表日期&#xff1a; 2023 1 阅读日期 &#xff1a;2023 11 29 研究背景&…

Bug 检查 0x7B:INACCESSIBLE_BOOT_DEVICE(未解决)

环境&#xff1a; HP ProDesk 480 G7 Win10 专业版 问题描述&#xff1a; INACCESSIBLE_BOOT_DEVICE bug 检查的值为0x0000007B。 此 bug 检查表明 Microsoft Windows 操作系统在启动过程中无法访问系统分区 原因&#xff1a; 1.INACCESSIBLE_BOOT_DEVICE bug 检查经常发生…

基于springboot实现实习管理系统的设计与实现项目【项目源码+论文说明】计算机毕业设计

基于sprinmgboot实现实习管理系统的设计与实现演示 摘要 随着信息化时代的到来&#xff0c;管理系统都趋向于智能化、系统化&#xff0c;实习管理也不例外&#xff0c;但目前国内仍都使用人工管理&#xff0c;市场规模越来越大&#xff0c;同时信息量也越来越庞大&#xff0c;…

Condition原码分析及实现原理

一、引言 Java作为一种广泛应用于企业级开发的编程语言&#xff0c;其内部机制和特性被许多开发者所关注。本文将深入分析Java Condition原码&#xff0c;以及Condition接口的实现原理&#xff0c;为大家提供一个更深入的了解。 二、Condition概述 Condition是Java并发编程中一…

【hacker送书第5期】SQL Server从入门到精通(第5版)

第5期图书推荐 内容简介作者简介图书目录参与方式 内容简介 SQL Server从入门到精通&#xff08;第5版&#xff09;》从初学者角度出发&#xff0c;通过通俗易懂的语言、丰富多彩的实例&#xff0c;详细介绍了SQL Server开发所必需的各方面技术。全书分为4篇共19章&#xff0c;…

jenkins使用nexus插件

nexus介绍 Nexus 是一个强大的仓库管理工具&#xff0c;用于管理和分发 Maven、npm、Docker 等软件包。它提供了一个集中的存储库&#xff0c;用于存储和管理软件包&#xff0c;并提供了版本控制、访问控制、构建和部署等功能。 Nexus 可以帮助开发团队提高软件包管理的效率和…

vue项目中通过vuex管理数据

目录 1.前言&#xff1a; 2.vuex的基础用法&#xff1a; 1.构建与挂载vue 基础模板渲染 构建仓库 2.mutations的使用 1.介绍 ​编辑 2.案列&#xff1a; 3.传参 4.辅助函数mapMutations&#xff1a; 3.module分对象的写法 介绍 建立模块&#xff1a; 访问数据的方…

python接口自动化测试之requests库的基础使用

简单介绍 requests库简单易用的HTTP库 Get请求 格式&#xff1a; requests.get(url) 注意&#xff1a;若需要传请求参数&#xff0c;可直接在 url 最后的 ? 后面&#xff0c;也可以调用 get() 时多加一个参数 params &#xff0c;传入请求参数&#xff0c;注意需要是 dict…

0基础学java-day8

一、项目-零钱通 1 项目开发流程说明 1.1 项目需求说明 使用 Java 开发 零钱通项目 , 可以完成收益入账&#xff0c;消费&#xff0c;查看明细&#xff0c;退出系统等功能. 1.2 项目的界面 化繁为简. 1) 先完成显示菜单&#xff0c;并可以选择 2) 完成零钱通明细. 3) 完成…

C++学习寄录(八.继承)

继承的语法&#xff1a;class 子类 : 继承方式 父类 class A : public B; A 类称为子类 或 派生类 B 类称为父类 或 基类 1.基本使用 未使用继承的代码比较冗余重复 #include <iostream> #include <fstream> #include <string> #include <chrono>…

leetcode:循环队列

题目描述 题目链接&#xff1a;622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09; 题目分析 我们开辟空间的时候多开一个&#xff0c;k是队列的长度&#xff0c;我们开k1个空间&#xff0c;定义一个front指向头&#xff0c;back的下一个指向尾 当frontback的时候&am…

八、hdfs文件系统副本块数量的配置

1、配置方式 2、实际操作演示 &#xff08;1&#xff09;在Hadoop用户的根目录下创建text.txt文件 &#xff08;2&#xff09;上传文件 hadoopnode1:~$ hdfs dfs -ls hdfs://node1:8020/ Found 4 items drwxr-xr-x - hadoop supergroup 0 2023-11-21 23:06 hdfs:/…

Spark经典案例分享

Spark经典案例 链接操作案例二次排序案例 链接操作案例 案例需求 数据介绍 代码如下&#xff1a; package base.charpter7import org.apache.hadoop.conf.Configuration import org.apache.hadoop.fs.{FileSystem, Path} import org.apache.spark.SparkContext import org.a…

springcloud==openfeign

单独使用 创建一个服务端 import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.Path…