Linux小程序--进度条

news2025/1/15 18:00:27

目录

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.coloradmin.cn/o/1459042.html

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

相关文章

Stable Diffusion——基础模型、VAE、LORA、Embedding各个模型的介绍与使用方法

前言 Stable Diffusion&#xff08;稳定扩散&#xff09;是一种生成模型&#xff0c;基于扩散过程来生成高质量的图像。它通过一个渐进过程&#xff0c;从一个简单的噪声开始&#xff0c;逐步转变成目标图像&#xff0c;生成高保真度的图像。这个模型的基础版本是基于扩散过程…

剪辑视频调色软件有哪些 剪辑视频软件哪个最好 剪辑视频怎么学 剪辑视频的方法和步骤 会声会影2024 会声会影视频制作教程

看了很多调色教程&#xff0c;背了一堆调色参数&#xff0c;可最终还是调不出理想的效果。别再怀疑自己了&#xff0c;不是你的剪辑技术不行&#xff0c;而是剪辑软件没选对。只要掌握了最基本的调色原理&#xff0c;一款适合自己的视频剪辑软件是很容易出片的。 有关剪辑视频…

3个密码学相关的问题

一、离散对数问题&#xff08;Discrete Logarithm Problem, DLP&#xff09; 问题描述&#xff1a;给定 有限阿贝尓群 G中的2个元素a和b&#xff0c;找出最小的正整数x满足&#xff1a;b a ^^ x &#xff08;或者证明这样的x不存在&#xff09;。 二、阶数问题&#xff08;O…

自定义表单工作流的优势特点有啥?

低代码技术平台是提升办公效率的得力武器&#xff0c;在当今竞争激烈的社会中获得了很多中小企业的喜爱与支持。流辰信息是一家专业研发低代码技术平台的服务商&#xff0c;IBPS开发平台用于很多行业中&#xff0c;助力企业实现了办公流程化。自定义表单工作流的优势多、简单灵…

宝塔nginx配置SpringBoot服务集群代理

宝塔nginx配置SpringBoot服务集群代理 1、需求&#xff1a; 现有一个springboot服务需要部署成集群&#xff0c;通过nginx负载均衡进行访问&#xff0c;其中这个springboot服务内置了MQTT服务、HTTP服务、TCP服务。 MQTT服务开放了1889端口 HTTP服务开放了8891端口 HTTP服务开…

加固平板电脑在森林勘探上的应用|亿道三防onerugged

随着对森林资源的重视和需求的增长&#xff0c;森林勘探成为了一项重要的工作。在这个领域中&#xff0c;加固平板电脑的应用为森林勘探工作带来了显著的改善。 首先&#xff0c;三防平板电脑具备良好的耐用性和适应性&#xff0c;能够在恶劣的环境条件下稳定运行。在森林勘探…

LeetCode--代码详解 54.螺旋矩阵

54.螺旋矩阵 题目 给你一个 m 行 n 列的矩阵 matrix &#xff0c;请按照 顺时针螺旋顺序 &#xff0c;返回矩阵中的所有元素。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]] 输出&#xff1a;[1,2,3,6,9,8,7,4,5]示例 2&#xff1a; 输入&#xff…

STM32 UART详细解读(代码的编写)

文章目录 前言一、查询方式编写串口发送和接收的代码二、中断方式编写串口发送和接收的代码总结 前言 本篇文章来给大家讲解USART的代码详细讲解和使用步骤。 一、查询方式编写串口发送和接收的代码 串口查询发送函数&#xff1a; HAL_StatusTypeDef HAL_UART_Transmit(UART…

第2.4章 StarRocks表设计——分区分桶与副本数

目录 一、数据分布 1.1 概述 1.2 数据分布方式 1.2.1 Round-Robin 1.2.2 Range 1.2.3 List 1.2.4 Hash 1.3 StarRocks的数据分布方式 1.3.1 不分区 Hash分桶 1.3.2 Range分区Hash分桶 三、分区 3.1 分区概述 3.2 创建分区 3.2.1 手动创建分区 3.2.2 批量创建分区…

MIT-BEVFusion系列九--CUDA-BEVFusion部署2 create_core之参数设置

目录 加载命令行参数main 函数中的 create_core图像归一化参数体素化参数稀疏卷积网络参数真实世界几何空间参数 (雷达坐标系下体素网格的参数)解码后边界框的参数构建 bevfusion::Core 存储推理时需要的参数 本章开始&#xff0c;我们将一起看CUDA-BEVFusion的代码流程&#x…

Sample Pairing(ICLR 2018)

paper&#xff1a;Data Augmentation by Pairing Samples for Images Classification 本文的创新点 本文提出了一种新的应用于图像分类的数据增强方法SamplePairing&#xff0c;这种简单的数据增强技术显著提高了所有测试的数据集的分类精度。此外当训练集中的样本数量非常少…

vue3+element Plus+ts 自定义主题色,以及生成主题色各种透明度

目录 思路 安装css-color-function【接收一个颜色值&#xff0c;生成不同的透明度】 获取后台配置的主题色或者使用ColorPicker修改主题色 最终结果如下 思路 本篇文章的主体思路是从element Plus官网引申而来。结合了我以前用vue2element-ui配置主题色生成透明度&#x…

fastApi笔记01-路径参数

路径参数 使用与 Python 格式化字符串相同的语法来声明路径"参数"或"变量" from fastapi import FastAPIapp FastAPI()app.get("/items/{item_id}") def read_item(item_id):return {"item_id": item_id} http://127.0.0.1:8000/i…

年薪最高开到160万,鸿蒙开发人才紧缺!

华为鸿蒙开发人才紧缺 如今&#xff0c;鸿蒙与安卓彻底切割时间似乎越来越近&#xff0c;一批嗅觉灵敏的互联网厂商已经完成或开始启动开发鸿蒙原生App&#xff0c;包括美团、网易、今日头条、钉钉等。随着头部App厂商启动鸿蒙&#xff08;HarmonyOS&#xff09;原生应用开发&…

智慧公厕管理系统:让城市智慧驿站更加智慧舒适

智慧公厕管理系统是城市智慧驿站中不可或缺的一部分&#xff0c;它通过全方位的信息化解决方案&#xff0c;为公共厕所的使用、运营和管理提供了一种智能化的方式。作为城市智慧驿站的重要组成部分&#xff0c;智慧公厕管理系统发挥着重要的作用&#xff0c;为城市社会民生提供…

提升生产3D渲染效率与品质:挖掘渲染农场的潜力

在当今数字化时代&#xff0c;3D渲染已成为跨越多个领域不可缺少的技术&#xff0c;无论是在建筑视觉化、电影制作、互动媒体还是虚拟现实领域。随着对动态、逼真视觉效果的需求不断增长&#xff0c;3D渲染农场因其出色的运算能力和经济性成为行业中的关键解决方案。本篇文章旨…

使用LangChain结合通义千问API基于自建知识库的多轮对话和流式输出

使用LangChain结合通义千问API基于自建知识库的多轮对话和流式输出 本文章的第三弹&#xff0c;由于LangChain本文不支持直接使用通义千问API进行多轮对话和流式输出&#xff0c;但是自建知识库呢&#xff0c;还需要LangChain,因此我尝试了一下&#xff0c;自建知识库用LangCh…

Spring源码:手写SpringIOC

文章目录 一、分析二、实现1、版本1&#xff1a;实现Bean注入IOC容器&#xff0c;并从容器中获取1&#xff09;定义BeanDefinition2&#xff09;定义BeanDefinition实现类3&#xff09;定义BeanDefinitionRegistry4&#xff09;定义Beanfactory5&#xff09;定义默认Beanfactor…

学会Requests库,就学会了Python接口自动化

在 Python 中进行网络请求是日常开发中的一个常见任务&#xff0c;而 requests 库是处理这类任务的一种强大工 具。requests 提供了简单而灵活的接口&#xff0c;使得发送 HTTP 请求和处理响应变得非常容易。在这篇文章中&#xff0c;我们将深入研究如何使用 requests 库执行各…

grid新建主从一对多

目录 总结一、步骤前端1.第一步-编写tabs的modelBody2.第二步编辑表扩展js 后端--重写表的add和Update方法1.第一步 总结 编写tabs的modelBody后编辑表扩展js在重写后端partial的Service 一、步骤 前端 1.第一步-编写tabs的modelBody 复制下面代码该改的改 <template&…