【Linux系列P7】进度条小程序的深度解剖(细节满满)

news2024/10/5 16:22:09

​​​​​在这里插入图片描述

前言

大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含
在这里插入图片描述

欢迎订阅 YY滴Linux专栏!更多干货持续更新!以下是传送门!

订阅专栏阅读: YY的《Linux》系列 ❀❀❀❀❀
【Linux系列-P1】Linux环境的搭建

【Linux系列-P2】 Linux的基本知识与指令
【Linux系列-P3】 Linux的权限
【Linux系列-P4】 Linux基本工具[yum][vim]

目录

一.在Linux中的设置

  • 用vim分别建立【main.c】【makefile】【processbar】【processBar.c】【processbar.h】,可视具体情况设置,文末有简略代码;
  • makefile文件如图所示
    在这里插入图片描述> - ./processbar 执行程序

细节:为什么在makefile中不用包含头文件?

  • 头文件就在源代码的当前目录下,编译器会自动去找到头文件

二.必备概念梳理

1.回车与换行的区别

  • 回车:光标回到当前行的左端
  • 换行:跳转到当前的下一行
  • PS:现在我们键盘上的ENTER同时兼备了回车和换行的功能
  • 在C语言中"\n"表示回车加换行,"\r"单单指的是回车;

2.缓冲区概念

引入: 缓冲区是C语言维护的一段内存

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

  • 在进度条小程序中,我们要特别注意标准输出流stdout
    在这里插入图片描述

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

  • 众所周知,在Linux中,显示器可以被当作一个文件;
  • 而且显示器默认是行刷新,也就是当输出内容配上“\n”后会直接回车+换行并立刻将内容打印在屏幕上,待睡眠结束后,才会弹出操作框;
  • 而当输出内容配上“\r”后,其会先输出到缓冲区中,待睡眠结束后才会和操作框一起输出
#include <stdio.h>
int main()
{
 printf("hello Makefile!\n");先行打印,待睡眠结束后才弹出操作框
 sleep(3);
 return 0;
 
 printf("hello Makefile!\r");待睡眠结束后才会和操作框一起打印
}

二.fflush函数

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

三.fflush函数的应用:倒计时功能

1.倒计时功能的实现原理

  • 利用不断的回车刷新实现

2.数据类型的表示细节

  • 显示2位数的数字 printf("%2d\r",cnt);
  • 此时功能正常【10,9,8…1,0】
  • 左对齐 printf("%-2d\r",cnt);

3.倒计时功能完整代码

#include <stdio.h>
#include <unistd.h>
int main()
{
  int cnt=10;倒计时功能
  while(cnt>=0)
  {
    printf("%d\r",cnt);              此时屏幕出现【109080...1000】,功能异常;
    fflush(stdout);
    cut--;
    sleep(1);
  }
  return 0;
}

三.设计进度条的各个部分

1.设计进度条主体部分

1.打印时为进度条预留空间

  • 设计一个字符数组,并初始化;此时其为一个空串
memset(bar, 0 ,sizeof(bar));

2.调整进度条主体加载方向

  • 在Linux环境下, 行默认是右对齐;所以随着不断的回车与换行,进度条呈现出来的效果是自右向左移动;
  • 我们只需要改为 [%-100s] 即可
 printf("[%-100s]\r", bar);

3.进度条主体部分代码

#include <unistd.h>
int main()
{
  int i = 0;
  
  char bar[102];
  memset(bar, 0 ,sizeof(bar));
  
  while(i <= 100 )
 {
   printf("[%-100s]\r", bar);
   fflush(stdout);
   bar[i++] = '#';
   usleep(10000);
 }
}

2.设计百分号进度部分

一.设计细节:"%如何表示"

  • 细节:由于【 % +’'字母为 数据类型】,斜杠【%】用【%%】表示

二.实现原理

  • while循环
int main()
{
 int i = 0;
 while(i <= 100 )
 {
 printf("[%d%%]",i);
 fflush(stdout);
 }
 return 0;
}

3.设计旋转光标部分

一.设计细节:"\ 如何表示"

  • 细节:由于【 \ +’'为 转义字符】,斜杠【\】用【\\】表示

二.实现原理

  • 常量字符串配合上【 i++% 4】
  • 【 -r 回车】 +【 fflush刷新图标】; 下一轮while循环,直接覆盖原来的字符,实现光标转动;
int main()
{
  int i = 0;
  const char *lable="|/-\\";
  while(i <= 100 )
  {
    printf("[%c]\r",lable[i++%4]);
    fflush(stdout);
  }
}

四.进度条完整代码

#include <unistd.h>
#include <string.h>
int main()
{
  int i = 0;
  char bar[102];
  memset(bar, 0 ,sizeof(bar));
  const char *lable="|/-\\";
  while(i <= 100 )
 {
   printf("[%-100s][%d%%][%c]\r", bar, i, lable[i%4]);
   fflush(stdout);
   bar[i++] = '#';
   usleep(10000);
 }
  printf("\n");
  return 0;
}

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

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

相关文章

SpringBoot项目中MVC使用--【SB系列之010】

SpringBoot系列文章目录 SpringBoot 的项目编译即报错处理–SB系列之001 —第一部的其它章节可以通过001链接 SpringBoot项目中WEB页面放哪里–【SB系列之008】 SpringBoot项目中WEB与Controller的联系–【SB系列之009】 ———————————————— 文章目录 SpringBoo…

线程池学习(五)线程工厂、线程池工厂

Executors 定义的Executor, ExecutorService, ScheduledExecutorService, ThreadFactory和Callable类的工厂和实用程序方法&#xff0c;我们称为线程池工厂。ThreadFactory 为定制化创建新线程的对象,我们称为线程工厂 前面几期的学习中&#xff0c;我已经初步会使用线程池了&…

用于公司文件防泄密用的保密软件(企业数据防泄密软件)

防止公司文件泄露是指采取各种措施和方法&#xff0c;以防止公司的敏感和机密文件被未经授权的人员获取、泄露或滥用的行为。 这些文件可能包含公司的商业机密、客户数据、财务信息、研发成果等重要资料&#xff0c;如果泄露给竞争对手、黑客或其他恶意人员&#xff0c;可能会对…

未在本地计算机上注册“microsoft.ACE.oledb.12.0”提供程序。

offiice64位的按装名字短的&#xff0c;office32位的安装名字长的 安装32位的AccessDatabaseEngine.exe&#xff0c;如果使用64位office点击安装32位access时提示无法安装&#xff0c;此时需要&#xff1a; 1.WINR打开运行&#xff0c;输入CMD&#xff0c;进入安装包文件夹 …

AHD模拟高清方案汇总及国产替代方案

由于模拟高清方案对比LVDS数字高清方案在降本、远距离传输的优势明显&#xff0c;及实现方案相对简单&#xff0c;模拟相机一直在车载和安防监控产品上有着较重要的市场地位。伴随着ZM贸易战和境外疫情影响愈来愈趋于严重化&#xff0c;原有外来品牌公司模拟高清方案在产品交期…

LeetCode 75 第五题(345)反转字符串中的元音字母

题目: 示例: 分析: 给一个字符串,将里面的元音字母反转,并且保持非元音字母不变(包括顺序). 字符串反转类型的题,我们都可以使用双指针来解决:定义首尾指针,分别向中间靠拢,直到首尾指针都指向了元音字母,然后交换首尾指针所指的字母,如此不会影响到非元音字母,同时也将元音字…

【4】Vite+Vue3左右容器中相同属性的元素内容自动对齐

在当今前端开发的领域里&#xff0c;快速、高效的项目构建工具以及使用最新技术栈是非常关键的。ViteVue3 组合为一体的项目实战示例专栏将带领你深入了解和掌握这一最新的前端开发工具和框架。 作为下一代前端构建工具&#xff0c;Vite 在开发中的启动速度和热重载方面具有突…

【运维小知识】(四)——linux常用命令

运维专栏&#xff1a;运维小知识 目录 1.&#x1f341;&#x1f341;用mv命令修改文件名 2.&#x1f343;&#x1f343;创建及删除文件夹即文件夹下所有文件 3.&#x1f342;&#x1f342;移动文件夹并重命名 4.&#x1f33f;&#x1f33f;复制文件 5.&#x1f344;&#x…

Redis相关配置(3)

⭐ 作者简介&#xff1a;码上言 ⭐ 代表教程&#xff1a;Spring Boot vue-element 开发个人博客项目实战教程 ⭐专栏内容&#xff1a;个人博客系统 ⭐我的文档网站&#xff1a;http://xyhwh-nav.cn/ 文章目录 Redis相关配置1、units2、Include3、loadmodule 加载模块4、NET…

MySQL-多表设计-一对多

多表的设计-概述 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种&#xff1a; 一…

【PostgreSQL内核学习(二)—— 查询分析】

查询分析 查询处理查询分析查询处理与查询分析的关系查询分析执行流程Lex和YaccLex&#xff1a;Yacc&#xff1a;词法分析工具Lex语法分析工具Yacc使用Lex和Yacc的案例 词法和语法分析以SELECT语句为例讲解 PostgreSQL中查询语句如何被解析并生成分析树。 语义分析 声明&#x…

【Vue面试题系列】四

VNode有哪些属性&#xff1f; Vue内部定义的Vnode对象包含了以下属性&#xff1a; __v_isVNode: true&#xff0c;内部属性&#xff0c;有该属性表示为Vnode __v_skip: true&#xff0c;内部属性&#xff0c;表示跳过响应式转换&#xff0c;reactive转换时会根据此属性进行判断…

黑马B站视频JAVA部分的知识范围、学习步骤详解

文章目录 学习资源选择最后选择 JAVA的知识范围JDBCswing与JAVAFX JAVA的学习步骤1.右侧的部分:2 JAVA的高级但是必须要学的3 有一些要学&#xff08;部分&#xff09;4力扣 总结作业配套资源 学习资源选择 我从画面&#xff08;一定要看清代码&#xff09;声音&#xff08;清…

金融中的数学:概率分布(上)

概率分布是描述随机变量可能取值的概率的函数。它可以用来描述离散变量和连续变量的概率分布。对于离散变量的概率分布&#xff0c;我们称其为离散概率分布。对于连续变量的概率分布&#xff0c;我们称其为连续概率分布。本文主要介绍离散型概率分布。 &#xff11;.离散型均匀…

华为ospf路由协议在局域网中的高级应用案例

关键配置&#xff1a; 1、出口为ospf区域0&#xff0c;下联汇聚依次区域1、2…&#xff0c;非骨干全部为完全nssa区域 2、核心&#xff08;abr&#xff09;上对非骨干区域进行路由汇总&#xff0c;用于解决出口两台路由的条目数量 3、ospf静默接口配置在汇聚下联接接入交换机的…

ngAfterViewInit( ) to early /// ngFor和异步网络请求导致无法选中目标元素的问题

今天遇到的最无语的问题&#xff1a; angular 8版本以上&#xff0c;我在ngafterViewInit&#xff08;&#xff09;中选取元素选取不到&#xff0c;加上setTimeOut&#xff08;&#xff09;之后才可以选中 网上的解释&#xff1a; Angular的ngAfterViewInit生命周期钩子是在组…

uniapp | 查看ios打包后的Info.plist文件

最近在用 uni 开发 ios 的时候给项目添加了自定义的 Info.plist 文件&#xff0c;但是打包后发现并没有生效&#xff0c;才有了查看打包后的 Info.plist 文件想法。 HBuilderX3.6.5起&#xff0c;支持直接在应用项目中配置 iOS 平台的 Info.plist 和 资源文件&#xff08;Bundl…

使用 uiautomator2+pytest+allure 进行 Android 的 UI 自动化测试

目录 前言&#xff1a; 介绍 pytest uiautomator2 allure 环境搭建 pytest uiautomator2 allure pytest 插件 实例 初始化 driver fixture 机制 数据共享 测试类 参数化 指定顺序 运行指定级别 重试 hook 函数 断言 运行 运行某个文件夹下的用例 运行某…

unity 2019 内置渲染管线 光照与Lighting面板 参数详解

文章目录 前言一 Unity的光照 与 烘焙光照1 unity完整的光照组成2 光的亮度与颜色3 全局光照直接光间接光5 间接光≠光照贴图 二 色彩空间与自动烘焙1 unity的色彩空间2 自动烘焙光照 三 烘焙1 什么是烘焙&#xff0c;烘焙的是什么2 如何进行烘焙3 烘焙的优点和缺点4 查看光照贴…

Redis : zmalloc.h:50:31: 致命错误:jemalloc/jemalloc.h:没有那个文件或目录

In file included from adlist.c:34:0: zmalloc.h:50:31: 致命错误&#xff1a;jemalloc/jemalloc.h&#xff1a;没有那个文件或目录 #include <jemalloc/jemalloc.h> 解决 : 如上图使用命令 make MALLOClibc