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*1024char* 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.ogcc -o $@ $^test.o:test.cgcc -c -o $@ $^game.o:game.cgcc -c -o $@ $^.PHONY:clean
clean:rm -rf *.o all​

  🌟结束语

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

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

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

相关文章

制作心理咨询小程序的详细指南

随着科技的的发展&#xff0c;小程序已经成为了人们日常生活中不可或缺的一部分。特别是在心理咨询这个领域&#xff0c;小程序可以提供一个更为便捷、高效的服务平台。本文将通过乔拓云平台为例&#xff0c;详细介绍如何制作一个心理咨询小程序。 首先&#xff0c;我们需要注册…

【软件测试】盘一盘工作中遇到的 Redis 异常测试

在测试工作中&#xff0c;涉及到与 redis 交互的场景变的越来越多了。关于redis本身就不作赘述了&#xff0c;网上随便搜&#xff0c;本人也做过一些整理。 今天只来复盘一下&#xff0c;在测试过程中与 redis 的二三事儿。其中提到的案例是经过抽象化的&#xff0c;用作辅助说…

【SpringCloud系列】@FeignClient微服务轻舞者

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

基于Java web的多功能游戏大厅系统的开发与实现

摘 要 目前&#xff0c;国内游戏市场上的网络游戏有许多种类&#xff0c;游戏在玩法上也越来越雷同&#xff0c;形式越来越单调。这种游戏性系统给玩家带来的成就感虽然是无穷的&#xff0c;但是也有随之而来的疲惫感&#xff0c;尤其是需要花费大量的时间和精力&#xff0c;这…

Findreport中框架图使用的注意事项

目录 简介 测试数据 闭环链路关系 解决办法&#xff1a; 根不唯一 解决办法&#xff1a; 简介 在框架图的应用中&#xff0c;一些表达上下游关系的数据非常适合用于做链路图相关的报表。可以展示成雪花图&#xff0c;普通架构图。但是在实际操作中有几点关于数据的注意事…

【STM32】OLED显示屏

1 调试方式 1. 串口调试&#xff1a;通过串口通信&#xff0c;将调试信息发送到电脑端&#xff0c;电脑使用串口助手显示调试信息 2. 显示屏调试&#xff1a;直接将显示屏连接到单片机&#xff0c;将调试信息打印在显示屏上 3. Keil调试模式&#xff1a;借助Keil软件的调试模…

【精选】VulnHub red 超详细过程思路

&#x1f36c; 博主介绍&#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 hacker-routing &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【应急响应】 【java】 【VulnHub靶场复现】【面试分析】 &#x1f389;点赞➕评论➕收藏 …

如何在代码中启动与关闭ROS节点

在ROS开发中&#xff0c;节点的管理是很重要的一部分&#xff0c;其中有一些节点大部分时候用不到&#xff0c;只会在特定情况下被启动&#xff08;比如建图节点&#xff09;同时这些节点在使用完后还需要被关闭&#xff0c;因此我们就需要在程序中对这些节点进行启动与关闭的管…

6 Redis缓存设计与性能优化

缓存穿透 缓存穿透是指查询一个根本不存在的数据&#xff0c; 缓存层和存储层都不会命中&#xff0c; 通常出于容错的考虑&#xff0c; 如果从存储层查不到数据则不写入缓存层。缓存穿透将导致不存在的数据每次请求都要到存储层去查询&#xff0c; 失去了缓存保护后端存储的意义…

从0开始学习JavaScript--JavaScript中的解构赋值及使用场景

在现代JavaScript中&#xff0c;解构赋值是一种强大而灵活的语法特性&#xff0c;它允许从数组或对象中提取值并赋给变量。这种语法不仅使代码更简洁&#xff0c;而且提高了可读性。在本篇文章中&#xff0c;将深入探讨JavaScript中解构赋值的基本概念、语法规则以及丰富的使用…

Python接口自动化测试如何设计接口测试用例(详解)

简介 上篇我们已经介绍了什么是接口测试和接口测试的意义。在开始接口测试之前&#xff0c;我们来想一下&#xff0c;如何进行接口测试的准备工作。或者说&#xff0c;接口测试的流程是什么&#xff1f;有些人就很好奇&#xff0c;接口测试要流程干嘛&#xff1f;不就是拿着接口…

亲子开衫外套 I 真的好温柔好有气质

分享适合宝宝和麻麻 一起穿的开衫外套 包芯纱拼貂毛 软糯亲肤不扎人 上身体验感非常不错 这种面料还不易起球 质感满满&#xff0c;单穿内搭都可&#xff01;

ChatGPT Plus/GPT4高级数据分析和插件功能详解

ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题&#xff0c;ChatGPT都能为您提供实用且高质量的建议和指导&#xff0c;提高编程效率和准确性。此外&#xff0c;ChatGPT是一位出色的合作伙伴&#xff0c;可以为您提供论文写作的…

智能优化算法应用:基于鸟群算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鸟群算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鸟群算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鸟群算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

Python向Excel写入内容的方法大全

在数据处理和分析中&#xff0c;将Python中的数据写入Excel是一项常见任务。 本文将介绍几种常见的方法&#xff0c;以及如何使用它们向Excel中写入内容。 方法一&#xff1a;使用openpyxl库 openpyxl是一个功能强大的库&#xff0c;用于读写Excel文件。以下是一个简单的使用…

Java数据结构之优先级队列(PriorityQueue)

1、概念 队列&#xff1a;是一种FIFO&#xff08;First-In-First-Out&#xff09;先进先出的数据结构&#xff0c;对应于生活中的排队的场景&#xff0c; 排在前面的人总是先通过&#xff0c;依次进行。 优先队列&#xff1a;是特殊的队列&#xff0c;从“优先”一词&#xff…

第20章 多线程

创建线程 继承Thread 类 Thread 类时 java.lang 包中的一个类&#xff0c;从类中实例化的对象代表线程&#xff0c;程序员启动一个新线程需要建立 Thread 实例。 Thread 对象需要一个任务来执行&#xff0c;任务是指线程在启动时执行的工作&#xff0c;start() 方法启动线程&am…

系列十五、BeanDefinition

一、BeanDefinition 1.1、概述 BeanDefinition是一个接口&#xff0c;主要负责存储bean的定义信息&#xff0c;决定bean的生产方式&#xff0c;是一个定义态的bean&#xff0c;类似于说明书。后续BeanFactory就可以根据这些信息生产bean了。比如实例化&#xff1a;可以通过反射…

NTT 的各类优化:Harvey、PtNTT,Intel AVX2、ARM Neon、GPGPU

参考文献&#xff1a; [Har14] Harvey D. Faster arithmetic for number-theoretic transforms[J]. Journal of Symbolic Computation, 2014, 60: 113-119.[Sei18] Seiler G. Faster AVX2 optimized NTT multiplication for Ring-LWE lattice cryptography[J]. Cryptology ePr…

QML Column Row 属性 pyside6

在 QML 中&#xff0c;Column 和 Row 是常用的布局元素&#xff0c;用于水平&#xff08;Row&#xff09;和垂直&#xff08;Column&#xff09;排列它们的子元素。以下是这两个元素的主要属性列表&#xff1a; Column 属性 spacing: 子元素之间的垂直间隔。width 和 height:…