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.rhkb.cn/news/260792.html

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

相关文章

视频生成模型:构建虚拟世界的模拟器 [译]

原文&#xff1a;Video generation models as world simulators 我们致力于在视频数据上开展生成模型的大规模训练。具体来说&#xff0c;我们针对不同时长、分辨率和宽高比的视频及图像&#xff0c;联合训练了基于文本条件的扩散模型。我们采用了一种 Transformer 架构&#…

基于JavaWeb开发的小区车辆登记系统计算机毕设[附源码]

基于JavaWeb开发的小区车辆登记系统计算机毕设[附源码] &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承接各种定制系统…

harmony 鸿蒙系统学习 安装ohpm报错 ohpm install failed

一. 安装配置 DevEco Studio 安装包时报错 execute ohpm install failed. Install task failed: ArkTS 3.2.12.5. Install ArkTS dependencies failed. 解决办法 找原因&#xff0c;首先&#xff0c;我的电脑中之前安装过node&#xff0c;也许是因为这个。&#xff08;其实…

【STM32 CubeMX】串口编程DMA+IDLE中断

文章目录 前言一、为什么要引入IDLE中断二、IDLE中断使用方式2.1 接收的三种情况2.2 函数的使用查询方式中断方式DMA方式分析一个问题 总结 前言 在嵌入式系统中&#xff0c;串口通信是一项关键的任务&#xff0c;而使用DMA&#xff08;直接内存访问&#xff09;结合IDLE中断进…

[经验] 玄殿社区qq堂4.2 #笔记#媒体

玄殿社区qq堂4.2 1、玄殿 玄殿&#xff0c;位于中国北京市的紫禁城内&#xff0c;是明清两代帝王祭天的场所。玄殿前殿为皇帝向神明祭拜的地方&#xff0c;中殿为祭天的主要场所&#xff0c;后殿为宋代遗址。玄殿规模庞大&#xff0c;身为中国传统建筑的代表之一&#xff0c;…

ubuntu分辨率更改、开机被重置、ubuntu屏幕小

ubuntu分辨率更改 分辨率改成&#xff1a;1920x1200 xrandr --size 1920x1200 在此之前可以先输入 xrandr 看支持哪些分辨率 开机被重置 我已经设置成这样了&#xff0c; 一开机变回这个 ubuntu屏幕小 输入命令行 xrandr --size 1920x1200 这个下次重启ubuntu又会重置…

yolov5转换成TensorRT推理过程笔记

笔记内容来自 B站 手写AI 一、用硬代码实现 GitHub - wang-xinyu/tensorrtx: Implementation of popular deep learning networks with TensorRT network definition API 安装python、cuda11.2、cudnn对应cuda11.2软件 1、在yolov5-master下训练完成后生成best.pt文件(训练时…

代码随想录刷题笔记-Day21

1. 二叉搜索树中的插入操作 701. 二叉搜索树中的插入操作https://leetcode.cn/problems/insert-into-a-binary-search-tree/给定二叉搜索树&#xff08;BST&#xff09;的根节点 root 和要插入树中的值 value &#xff0c;将值插入二叉搜索树。 返回插入后二叉搜索树的根节点。…

【面试题】谈谈MySQL的索引

索引是啥 可以把Mysql的索引看做是一本书的目录&#xff0c;当你需要快速查找某个章节在哪的时候&#xff0c;就可以利用目录&#xff0c;快速的得到某个章节的具体的页码。Mysql的索引就是为了提高查询的速度&#xff0c;但是降低了增删改的操作效率&#xff0c;也提高了空间…

springboot启动自动配置

1.自定义项命名启动类规范&#xff1a; 功能在前名字在后比如 aliyun-oss-spring-boot-starter starter表示启动 springboot版本需要2.7.5 2.创建springboot工程把该删除的文件删除 3.启动类 pom文件导入自定义配置类依赖 比如 <!--第2步--><!-- 启动类 pom…

数据结构--排序

数据结构--排序 1. 各类排序算法的性质2. 插入排序2.1 直接插入排序2.2 折半插入排序 3. 希尔排序4. 交换排序4.2 冒泡排序 5. 快速排序6. 选择排序6.1 简单选择排序6.2 堆排序 7. 归并排序8. 基数排序 1. 各类排序算法的性质 2. 插入排序 2.1 直接插入排序 2.2 折半插入排序 …

左右联动布局效果

效果图&#xff1a; <template><el-dialog :modelValue"modelValue" :before-close"close" fullscreen :close-on-click-modal"false"><div class"farmer_detail"><div class"info_content"><di…

算法-矩阵置零

1、题目来源 73. 矩阵置零 - 力扣&#xff08;LeetCode&#xff09; 2、题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,1,1],[1,0,1…

深度学习基础之《TensorFlow框架(3)—TensorBoard》

一、TensorBoard可视化学习 1、TensorFlow有一个亮点就是&#xff0c;我们能看到自己写的程序的可视化效果&#xff0c;这个功能就是TensorBoard 2、TensorFlow可用于训练大规模深度神经网络所需的计算&#xff0c;使用该工具涉及的计算往往复杂而深奥。为了方便TensorFlow程…

C语言---指针进阶

1.字符指针 int main() {char str1[] "hello world";char str2[] "hello world";const char* str3 "hello world.";const char* str4 "hello world.";if (str3 str4){//常量字符串在内存里面是无法修改的&#xff0c;所以没必要…

Aster实现一台电脑当两台使——副屏搭配键鼠

前言&#xff1a;笔者每年回家&#xff0c;都面临着想要和小伙伴一起玩游戏&#xff0c;但小伙伴没有电脑/只有低配电脑的问题。与此同时&#xff0c;笔者自身的电脑是高配置的电脑&#xff0c;因此笔者想到&#xff0c;能否在自己的电脑上运行游戏&#xff0c;在小伙伴的电脑上…

详解平面点云面积计算

部分代码展示&#xff1a; &#xff08;1&#xff09;利用格网法计算面积&#xff1a; //&#xff08;2&#xff09;测试使用格网法计算平面点云面积 void main() {char *inputpath "D:\\testdata\\data.txt";vector<pcl::PointXYZ> points ReadPointXYZIn…

五种多目标优化算法(MOGWO、MOJS、NSWOA、MOPSO、MOAHA)性能对比(提供MATLAB代码)

一、5种多目标优化算法简介 1.1MOGWO 1.2MOJS 1.3NSWOA 1.4MOPSO 1.5MOAHA 二、5种多目标优化算法性能对比 为了测试5种算法的性能将其求解9个多目标测试函数&#xff08;zdt1、zdt2 、zdt3、 zdt4、 zdt6 、Schaffer、 Kursawe 、Viennet2、 Viennet3&#xff09;&#xff0…

14. UE5 RPG使用曲线表格设置回复血量值

之前的文章中&#xff0c;我使用的都是固定的数值来设置血量回复或者蓝量回复&#xff0c;在这篇文章里面&#xff0c;介绍一下使用曲线表格。通过曲线表格我们可以设置多个数值&#xff0c;然后通过去通过修改索引对应的数值去修改回复的血量或者蓝量。 创建曲线表格 首先创…