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;
}

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

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

相关文章

【Flink状态管理(八)】Checkpoint:CheckpointBarrier对齐后Checkpoint完成、通知

文章目录 一. 调用StreamTask执行Checkpoint操作1. 执行Checkpoint总体代码流程1.1. StreamTask.checkpointState()1.2. executeCheckpointing1.3. 将算子中的状态快照操作封装在OperatorSnapshotFutures中1.4. 算子状态进行快照1.5. 状态数据快照持久化 二. CheckpointCoordin…

什么是伪数组 以及伪数组转真数组的方法

什么是伪数组呢&#xff1f; 1.我们先来看看用于接受实参的方法 arguments , 执行代码如下&#xff1a; function fn() { console.log(arguments);}fn(1,2,3,4,5) 这里可以看到&#xff0c;Arguments显示的也有方括号 [1,2,3,4,5...] &#xff0c;但是后面多了一些其他方法&a…

c++类和对象新手保姆级上手教学(中)

前言&#xff1a; 类和对象中篇&#xff0c;这里讲到的前4个默认成员函数&#xff0c;是类和对象中的重难点&#xff0c;许多资料上的讲法都非常抽象&#xff0c;难以理解&#xff0c;所以我作出这篇总结&#xff0c;分享学习经验&#xff0c;以便日后复习。 目录 6个默认成员…

新算法UoT助力AI提问——主动寻求信息,任务完成率提高57.8%

引言&#xff1a;信息寻求在不确定性环境中的重要性 在不确定性环境中&#xff0c;信息寻求的能力至关重要。在许多实际应用中&#xff0c;如医学诊断和故障排除&#xff0c;解决任务所需的信息并非一开始就给出&#xff0c;而需要通过提问后续问题来主动寻求&#xff08;例如…

MobaXterm的SFTP文件上传/下载

一、MobaXterm的简介 MobaXterm是一款功能强大的远程计算工具&#xff0c;集成了诸多网络工具和便利功能&#xff0c;包括SSH、X11服务器、SFTP等&#xff0c;支持Windows系统。用户可以使用MobaXterm来轻松管理远程服务器&#xff0c;进行文件传输&#xff0c;远程桌面显示等操…

Rocky 8.9 Kubespray v2.24.0 在线部署 kubernetes v1.28.6 集群

文章目录 1. 简介2. 预备条件3. 基础配置3.1 配置hostname3.2 配置互信 4. 配置部署环境4.1 在线安装docker4.2 启动容器 kubespray4.3 编写 inventory.ini4.4 关闭防火墙、swap、selinux4.5 配置内核模块 5. 部署 1. 简介 kubespray​ 是一个用于部署和管理 Kubernetes 集群的…

掌握array_walk()函数:解锁PHP数组操作的神奇力量!

掌握array_walk()函数&#xff1a;解锁PHP数组操作的神奇力量&#xff01; 在 PHP 开发过程中&#xff0c;我们经常需要对数组进行遍历和处理。array_walk() 函数是 PHP 函数库中的一个重要工具&#xff0c;它提供了一种便捷的方式来对数组中的每个元素执行自定义操作。本文将深…

【EI会议征稿通知】2024年第四届计算机视觉与模式分析国际学术大会(ICCPA 2024)

2024年第四届计算机视觉与模式分析国际学术大会&#xff08;ICCPA 2024&#xff09; 2024 4th International Conference on Computer Vision and Pattern Analysis (ICCPA 2024) 第四届计算机视觉与模式分析国际会议&#xff08;ICCPA 2024&#xff09;将于2024年5月17日至1…

Unity编辑器扩展之是否勾选Text组件BestFit选项工具(此篇教程也可以操作其他组件的属性)

想要批量化是否勾选项目预制体资源中Text组件BestFit属性&#xff08;此篇教程也可以操作其他组件的属性&#xff0c;只不过需要修改其中对应的代码&#xff09;&#xff0c;可以采用以下步骤。 1、在项目的Editor文件中&#xff0c;新建一个名为TextBestFitBatchProcessor的…

忘记管理员密码

1、在/home/jenkins/config.xml中删除&#xff1a; <useSecurity>true</useSecurity><authorizationStrategy class"hudson.security.FullControlOnceLoggedInAuthorizationStrategy"><denyAnonymousReadAccess>false</denyAnonymousRea…

html+css+jquery实现轮播图自动切换、左右切换、点击切换

pc端也好、移动端也好&#xff0c;轮播图很常见&#xff0c;今天用htmlcssjquery实现小米商城轮播图&#xff0c;套UI框架更容易实现 步骤1&#xff1a;把静态轮播图用divcss布局出来&#xff0c;采用盒子模型、相对绝对定位实现 代码如下&#xff1a; <!doctype html>…

leetcode:无重复字符的最长字串(详解)

文章目录 一、题目描述&#xff1f;二、题解方案一&#xff1a;容易理解&#xff08;时间复杂度O(n)&#xff09;方案二&#xff1a;滑动窗口&#xff08;时间复杂度O(n)&#xff09; 一、题目描述&#xff1f; 给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最…

十二:枚举与注解

文章目录 01、枚举类的使用1.1、枚举类的理解1.2、自定义枚举类1.3、使用enum关键字定义枚举类1.4、Enum类中的常用方法1.5、使用enum关键字定义的枚举类实现接口 02、注解的使用2.1、注解的理解2.3、如何自定义注解2.4、jdk中4个基本的元注解的使用12.5、jdk中4个基本的元注解…

补-代码随想录第23天|● 669. 修剪二叉搜索树 ● 108.将有序数组转换为二叉搜索树 ● 538.把二叉搜索树转换为累加树

二叉树最后一天 ● 669. 修剪二叉搜索树思路一&#xff1a;递归递归三部曲代码&#xff1a; 思路二&#xff1a;迭代代码&#xff1a; ● 108.将有序数组转换为二叉搜索树思路&#xff1a;递归代码;[左闭右闭] ● 538.把二叉搜索树转换为累加树思路&#xff1a;递归 代码&#…

java基础训练题(2)

一、题目 1. 以下程序输出&#xff08;D&#xff09; public static void main(String[] args) {int num 2;switch (num) {case 1:num;case 2:num;case 3:num;default:num;break;}System.out.println(num);} } A&#xff1a;2 B&#xff1a;3 C&#xff1a;4 D&#xff…

解决本地googleapis 谷歌统计 nodejs 遇到 ECONNRESET和 ETIMEDOUT

在本地通过谷歌分析接口, 获取网站的访问量统计, 用于在管理端面板世界地图显示 获取分析数据的部分代码,这部分很简单示例有 // 获得前10个页面浏览量与页面标题在过去30天 const {BetaAnalyticsDataClient} require(google-analytics/data); const analyticsDataClient ne…

62-JS-canvas画布高斯模糊之图像操作

将一张图片放到canvas画布上 1.绘制图像drawImage <img src="./3.webp" alt=""><canvas></canvas><script>var canvas = document.getElementsByTagName("canvas")[0];canvas.width = 500;canvas.height = 500;var a …

“薪”的一年程序员裁员潮技术变革情况下 程序员就业机会在哪里?

引言&#xff1a;一对来自中国的工程师夫妻在美国的不幸身亡&#xff0c;疑似与谷歌的裁员有关&#xff0c;这一事件再次引发了人们对技术变革下裁员对程序员影响的关注。 一、针对裁员潮的一些看法 在我看来&#xff0c;技术变革对程序员的影响是双面的。一方面&#xff0c;…

anomalib1.0学习纪实-续3:结合python lightning理思路

一、python lightning python lightning是个好东西&#xff0c;但不见得那么友好。 GPT4给我讲解了他的用法&#xff1a; 二、anomalib的思路 1、 创建一个Lightning Module。 首先&#xff0c;在src\anomalib\models\components\base\anomaly_module.py中&#xff0c; cl…

你真的了解—————NumPy吗

&#x1f308;个人主页&#xff1a;小田爱学编程 &#x1f525; 系列专栏&#xff1a;opencv &#x1f3c6;&#x1f3c6;关注博主&#xff0c;随时获取更多关于IT的优质内容&#xff01;&#x1f3c6;&#x1f3c6; &#x1f600;欢迎来到小田代码世界~ &#x1f601; 喜欢的…