Linux小程序--进度条

目录

1.知识补充

1.1回车和换行 

1.2缓冲区

2.实现倒计时 

3.实现进度条 


1.知识补充

1.在制作小程序进度条之前,我们先了解一下,回车换行和行缓冲区的概念。

2.动态效果,在同一个位置刷新不同的图像,实现一个倒计时的效果。

3.有了上面的基础我们就可以实现进度条了


1.1回车和换行 

所以说回车和换行是两个动作。

这是老式键盘。

在C语言中,\r表示的是只回车,\n表示的是只换行。


1.2缓冲区

看下面两段代码:

运行这个代码发现:printf打印的内容显示三秒后程序结束

运行这个代码发现:等待三秒后显示printf打印的内容程序结束

是因为下面子这段代码先执行sleep函数吗?当然不是,C语言的代码都是从上往下执行的,那为什么下面的代码是先暂停三秒然后才进行打印的呢?

这是因为在sleep期间,字符串进入了缓冲区。

缓冲区是计算机中用于临时存储数据的内存区域。在输入/输出操作中,数据通常不会立即传输到目的地,而是先存储在缓冲区中,以提高效率。缓冲区主要分为输入缓冲区和输出缓冲区:

1. **输入缓冲区**:用于存储从输入设备(如键盘、鼠标、文件等)读取的数据,直到程序准备处理这些数据。例如,当你输入文本时,字符会被存储在输入缓冲区中,直到程序读取并处理这些字符。

2. **输出缓冲区**:用于存储程序要发送到输出设备(如屏幕、打印机、文件等)的数据,直到达到一定条件时才会将数据发送到目的地。例如,当程序使用 printf 函数打印文本时,文本会先存储在输出缓冲区中,直到缓冲区满了、遇到换行符或调用 fflush 函数时才会将数据刷新到屏幕上。

在前面的例子中,由于 printf 函数打印的文本被存储在输出缓冲区中,而在调用 sleep(3) 函数之前并没有刷新缓冲区,所以你会看到在暂停3秒后才会将文本显示出来。这展示了缓冲区在程序执行过程中的作用。缓冲区的使用可以提高I/O操作的效率,但有时也需要注意缓冲区的刷新以避免数据延迟显示或丢失。

程序结束的时候,一般自动冲刷缓冲区。缓冲区满了也会进行刷新。

包含\n之前的字符会立即刷新。

还有一种情况,我既不想缓冲区满了才刷新,我也不想带\n进行刷新,该怎么办呢?


如果你想在不等待缓冲区满了或不使用换行符的情况下立即刷新输出缓冲区,你可以使用 fflush(stdout) 函数来手动刷新标准输出缓冲区。这样可以确保缓冲区中的内容立即被输出到屏幕上,而不必等待缓冲区满或遇到换行符。以下是一个示例代码:

这个示例中, fflush(stdout) 函数用于手动刷新标准输出缓冲区,确保在暂停3秒之前将文本立即显示在屏幕上。这样你就可以在需要时控制何时刷新输出缓冲区,而不必等待缓冲区满或使用换行符。


2.实现倒计时 

 如何实现倒计时?

在同一个位置不断的刷新数字,如何做到?

输出一个数字,然后使用回车重新回到原来的位置(为了让数字变动的慢一些,我们设置sleep为1s,代码示例:

我们运行代码发现,什么数字都没有显示,程序10s后结束,这是因为出现在缓冲区还没有刷新就被覆盖掉了,所有我们要使用fflush函数刷新缓冲区

这样程序就有倒计时的效果了。

但如果是超过一个位数的这是就要控制回车移动的位置了:

eg:20s倒计时


3.实现进度条 

准备工作:

第一个文件负责进度条功能的实现,第二个文件负责进度条功能的声明,第三个文件负责进度条的运行测试。Makefile负责进度条的自动化构建。

什么样的进度条:

我们在第一个位置预留100个字符的空间(显示进度条在增加),第二个位置显示进度,第三个位置有一个旋转的光标以表示在加载中。。。

首先定义一个char数组,memset全初始化为"\0",这时我们就一个一个的往数组中填写”#"

(间隔1s)表示进度条的增加

初步效果:确实在增加,但我们只需要他在一行中不断的打印

我们通过回车去覆盖,然后让缓冲区不断的刷新,这就有了只在一行中不断增加的效果

+、

我们在运行的过程中发现1s的间隔太慢,在这里我们将sleep函数换成(usleep)函数,间隔单位为微秒。(这里间隔换算为秒为:0.02s)

我们在显示的时候发现,进度条的框是随着进度的增加而变大的,这样的效果不太好看,因此我们直接预留100字符大小的框,这时我们再打印的时候就会发现框是有100个字符“#”的长度,但是进度条是从右往左增加的,这时因为字符默认是右对齐的,加上-变成左对齐。

这时候我们还可以在后面加上显示进度了百分之多少,在Linux中打印%,只需要输入连续的两个%:

最后我们将正在加载的效果显示出来:原理和倒计时一样,为了达到旋转的效果,我们将用几个方向的线顺序的出现来达到旋转的视觉效果

在这里模len是为了防止数组的越界

这时就有了旋转的效果了。

完整代码:

#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.mzph.cn/news/691805.shtml

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

相关文章

2024最新软件测试面试题(带答案)

1. 请自我介绍一下(需简单清楚的表述自已的基本情况&#xff0c;在这过程中要展现出自信&#xff0c;对工作有激情&#xff0c;上进&#xff0c;好学) 面试官您好&#xff0c;我叫###&#xff0c;今年26岁&#xff0c;来自江西九江&#xff0c;就读专业是电子商务&#xff0c;毕…

2024年华为OD机试真题- 求字符串中所有整数的最小和-Java-OD统一考试(C卷)

题目描述: 输入字符串s,输出s中包含所有整数的最小和 说明 1. 字符串s,只包含 a-z A-Z +- ; 2. 合法的整数包括 1) 正整数 一个或者多个0-9组成,如 0 2 3 002 102 2)负整数 负号 - 开头,数字部分由一个或者多个0-9组成,如 -0 -012 -23 -00023 输入描述: 包含…

Linux 磁盘分区、挂载

Linux 磁盘分区、挂载 Linux 分区 介绍 Linux 来说无论有几个分区&#xff0c;分给哪一目录使用&#xff0c;它归根结底就只有一个根目录&#xff0c;一个独立且唯一的文件结构 , Linux 中每个分区都是用来组成整个文件系统的一部分。 Linux 采用了一种叫“载入”的处理方法&…

(十四)devops持续集成开发——jenkins流水线使用pipeline方式发布项目

前言 本节内容我们使用另外一种方式pipeline实现项目的流水线部署发布&#xff0c;Jenkins Pipeline是一种允许以代码方式定义持续集成和持续交付流水线的工具。通过Jenkins Pipeline&#xff0c;可以将整个项目的构建、测试和部署过程以脚本的形式写入Jenkinsfile中&#xff…

爬虫02-python爬虫使用的库及详解

文章目录 1 Urllib库的基本使用① 基本url请求② 查看http请求的响应信息③ 另一个请求方法&#xff1a;Request④ Handler 处理请求和响应 & Cookie 存储用户信息⑤ 异常处理⑥ url解析 2 Requests库的基本使用① 模块的简单使用② requests模块的各种请求方式③ 请求④ 响…

打通全渠道,聚道云助力时尚巨头提升运营效能

客户介绍&#xff1a; 北京某时尚有限公司是一家集设计、生产、销售于一体的时尚产业领军企业。自成立以来&#xff0c;该公司一直秉承着对时尚的独特理解和不懈追求&#xff0c;以打造高品质、高品位的时尚产品为己任&#xff0c;深受国内外消费者的喜爱。 客户痛点&#xff…

springcloud:1.Eureka详细讲解

Eureka 是 Netflix 开源的一个服务注册和发现工具,被广泛应用于微服务架构中。作为微服务架构中的核心组件之一,Eureka 提供了服务注册、发现和失效剔除等功能,帮助构建弹性、高可用的分布式系统。在现代软件开发领域,使用 Eureka 可以有效地管理和监控服务实例,实现服务之…

网络安全综合实验

1.实验拓扑 在这里注意因为第四个要求配置双击热备&#xff0c;我们可以第一时间配置&#xff0c;避免二次重复配置消耗时间 4、FW1和FW3组成主备模式的双机热备 具体配置位置在系统-->高可靠性-->双机热备-->配置 这里上行链路有两组&#xff0c;分别为电信和移动&…

Sora后观察:AI大模型产业落地的八个锚点

在正在进行的2024年&#xff0c;国内大模型也将更下沉和落地&#xff0c;在技术上的突破之外&#xff0c;也会出现更多的向下的产业兼容和产业实践案例&#xff0c;作为新质生产力推动产业数字化转型的航船加速前进。 作者|斗斗 编辑|皮爷 出品|产业家 “电影讲述了一名…

期权无风险套利策略[2]—牛市垂直价差套利

牛市垂直价差 牛市垂直价差可以分为牛市看涨期权价差策略与牛市看跌期权价差策略。 其中&#xff0c;牛市看涨价差策略是指投资者买入较低行权价的认购期权、同时卖出数量较高行权价的同月认购期权。 牛市看跌价差策略同理&#xff0c;将看涨期权换成看跌期权即可。 牛市价…

分布式id实战

目录 常用方式 特征 潜在问题 信息安全 高性能 UUID 雪花算法 数据库生成 美团Leaf方案 Leaf-segment 数据库方案 Leaf-snowflake 方案 常用方式 uuid雪花算法数据库主键 特征 全局唯一趋势递增信息安全 潜在问题 信息安全 如果id连续递增, 容易被爬虫, 批量下…

Numba原子操作和期权蒙特卡洛估值

期权的蒙特卡洛法估值的一般步骤是 1&#xff0c;生成大量标的价格路径&#xff0c;这一步是通用的&#xff0c;对所有的期权都是一样的 2&#xff0c;根据价格路径计算到期日期权的价值&#xff0c;这一步根据期权类型的不同 3&#xff0c;求所有路径下期权价值贴现的期望。这…

想要拿下优质客户,一定把握好这几个关键阶段!

要想成交一个有潜力的优质客户往往需要经历五个阶段。这五个阶段分别是&#xff1a;获联、筛选、入野、破局、快速成交。 1、获联 我们的第一步工作&#xff0c;就是需要主动或者被动去吸引客户&#xff0c;把客户引进来。将客户引进来的方式有很多&#xff0c;比如朋友介绍、…

Java系列:Java多线程编程经典问题详解,深入解析Java多线程生命周期、死锁、活锁与饥饿、守护线程等问题

多线程编程是Java语言中的一个高级主题&#xff0c;它在提高程序性能和响应性方面起着至关重要的作用。本文旨在帮助Java学习人员深入理解多线程的概念&#xff0c;并准备相关的技术面试。 线程与进程 在深入多线程之前&#xff0c;我们需要理解线程与进程的基本概念。进程是…

汽车控制器软件正向开发

需求常见问题: 1.系统需求没有分层,没有结构化,依赖关系不明确 2.需求中没有验证准则 3.对客户需求的追溯缺失,不完整,颗粒度不够 4.系统需求没有相应的系统架构,需求没有分解到硬件和软件 5.需求变更管控不严格,变更频繁,变更纪录描述不准确,有遗漏,客户需求多…

Python学习笔记——按钮对象样式及字符串的格式化

在Python中使用PyQt或者PySide中按钮对象&#xff0c;可以使用setStyleSheet()方法更新按钮对象的样式&#xff0c;如果需要多次或者对多个按钮更新类似的样式&#xff0c;可以先建立一个样式字符串&#xff0c;字符串中包含定义的变量&#xff0c;通过字符串的格式化format()方…

SpringBoot配置文件日志

目录 一、SpringBoot配置文件的作用 二、SpringBoot配置文件的分类 1、application.properties 2、application.yml 3、application.yaml 三、使用配置文件实例--验证码 1、使用Kaptcha插件生成验证码 2、网页需求分析 3、前端页面 4、发送请求 5、服务器作出响应 …

VUE3 中导入Visio 图形

微软的Visio是一个功能强大的图形设计工具&#xff0c;它能够绘制流程图&#xff0c;P&ID&#xff0c;UML 类图等工程设计中常用的图形。它要比其它图形设计软件要简单许多。以后我的博文中将更多地使用VISO 来绘制图形。之前我一直使用的是corelDraw。 Visio 已经在工程设…

Django中redis和日志配置

# django-redis 配置 CACHES {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://192.168.3.109:6379/0","OPTIONS": {"CLIENT_CLASS": "django_redis.client.Defau…

【编程】Rust语言入门第5篇 复合类型——数组、结构体、元组、枚举

数组 Rust中有定长数组、变长数组&#xff0c;与两种字符串类似&#xff0c;前者在栈上&#xff0c;记为array&#xff0c;速度快&#xff0c;后者类型为Vector&#xff0c;在堆上&#xff0c;性能较低。 声明 Rust数组的声明比C形式较简&#xff0c;与Python形似。 let arr…