Linux进度条实现

Linux进度条实现

  • 1.\r\n
  • 2.缓冲区
  • 3.缓冲区分类
  • 4.进度条实现

🌟🌟hello,各位读者大大们你们好呀🌟🌟
🚀🚀系列专栏:【Linux的学习】
📝📝本篇内容:\r\n,缓冲区;缓冲区分类;进度条实现
⬆⬆⬆⬆上一篇:循环队列(C语言版)
💖💖作者简介:轩情吖,请多多指教(> •̀֊•́ ) ̖́-

1.\r\n

在我们将进度条之前,我们先来谈谈我们以前学习的换行和回车,了解了这个才能更好的完成进度条。
在我们的以前的学习中,认为\n就是简单的换行,即如下图所示
在这里插入图片描述
但是不知道同学们有没有发现一个问题,那就是其实换行,不只是简单的到了下一行,而是到了下一行并且回到了开头,从底层的角度来说,这是回车\t的作用。但是我们在使用的过程中\n就完成了这两步骤,即换行+回车,这是语言的功劳,看下面的演示
在这里插入图片描述
可以发现我们的\n直接换行+回车的功能

2.缓冲区

接下来我们来看一下单纯的\r的作用
在这里插入图片描述
在这里插入图片描述
我们发现程序运行下来好像没有任何的效果,这是为什么?
其实是因为我们的\t是回车,让光标回到了开头,我们的程序执行的又很快,执行完后又需要显示出命令行,因此直接把打印出来的东西给覆盖了。我们来看一下不带回车\t的情况
在这里插入图片描述
在这里插入图片描述
可以看到啥都不带的情况下,命令行直接在打印内容后面显示了,前面带上\t就是让光标回到了开头,从头开始显示,所以说导致了前面一个程序啥都没显示,这就能更好的理解了。接下来我们设置一个睡眠时间,来更好的看清楚它的执行过程
在这里插入图片描述
在这里插入图片描述

我们这个时候发现怎么还是没有显示出来?这就非常奇怪了
这就不得不来讲一下缓冲区,我们的printf()中的内容不是说会直接显示在显示器上的,而是先放到缓冲区中,缓冲区会根据特定的规则进行刷新。我们对于显示器的刷新是行刷新,因此我们并没有进行换行什么的,就只能到程序结束时才会刷新了。不过我们可以使用fflush函数来进行主动刷新缓冲区
在这里插入图片描述
和我们之前说的一样,在睡眠的5秒期间,光标一直显示在开头,因此后续显示命令行就直接覆盖了
我们再来看一下,使用换行的情况下,睡眠期间能否打印出来
在这里插入图片描述
在这里插入图片描述可以看到如果是带了\n,那就达到了显示器的行缓冲区的要求,即使不使用fflush也能立马打印出来
那有的同学会问,如果啥都不带会是什么情况呢?答案是会到程序结束再打印出来,我们来看下面的演示
在这里插入图片描述
在这里插入图片描述
这样的结果是因为虽然并没有换行符来使内容立马打印出来,但是程序结束前,也需要刷新一下缓冲区。
注意:windows下的情况不一定一样,不同的平台对缓冲区的处理不同,在VS下即使没有\n,也能立马打印出来,对于这一点我认为是图形化界面就是为了可视,所以说就直接显示出来了,无需等待

#include <stdio.h>
#include <Windows.h>
int main()
{printf("hello world");Sleep(10000);//毫秒return 0;
}

在这里插入图片描述

3.缓冲区分类

缓冲区分为三种类型:全缓冲、行缓冲和不带缓冲
全缓冲:在这种情况下,当填满标准I/O缓存后才进行实际I/O操作。全缓冲的典型代表是对磁盘文件的读写。
行缓冲:在这种情况下,当在输入和输出中遇到换行符时,执行真正的I/O操作。这时,我们输入的字符先存放在缓冲区,等按下回车键换行时才进行实际的I/O操作。典型代表是标准输入(stdin)和标准输出(stdout)。
不带缓冲:也就是不进行缓冲,标准出错情况stderr是典型代表,这使得出错信息可以直接尽快地显示出来。
接下来验证一下不带缓冲区和全缓冲区,行缓冲区前面已经讲过了

全缓冲区验证:

#include <stdio.h>
#include <unistd.h>
#include <string.h>
int main()
{FILE *fp = fopen("./log.txt", "a");int i = 0;char str[]="hello";while (i <= 100000){fwrite(str,strlen(str),1,fp);usleep(10000);//0.01秒,usleep()单位是微秒i++;}while(1);return 0;
}

在这里插入图片描述

可以看到我们执行了代码后,右边的显示log.txt操作持续了好几次都没有显示东西出来,过了一会就出现了,这就证明了只有当缓冲区满了后才会刷盘(测试时如果要清空log.txt可以使用>log.txt重定向)
但是这只是语言层面的,在操作系统的系统调用中的IO不是这样的,它有自己的策略

#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <cstring>
int main()
{umask(0);int fd = open("./log.txt",O_WRONLY|O_CREAT,0666);//使用系统的IOint i = 0;char str[]="hello";while (i <= 100000){write(fd,str,strlen(str));usleep(10000);//0.01秒,usleep()单位是微秒i++;}// while(1);//保证不是因为程序退出而写入的return 0;
}

在这里插入图片描述

不带缓冲区验证:

#include <stdio.h>
#include <unistd.h>
int main()
{fprintf(stderr,"hello world");sleep(5);return 0;
}

在这里插入图片描述

4.进度条实现

在这里插入图片描述
我们要实现的进度条是这样的,如上图
先来看一下第一个版本

// main.cc
#include "progress.hpp"
#include <unistd.h>
int main()
{Run();return 0;
}
//progress.cc
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#define BUFF_SIZE 101
#define STYLE '#'
void Run()
{// 1.先定义一个缓冲区来存储进度条char buff[BUFF_SIZE]; // 需要101一个的原因是最后要添加\0// 清空,保证全为0,后续就不需要在进行修改memset(buff, 0, sizeof(buff));//2.设置动态的标志,保证进度条在运行char lable[5]="/|-\\";// 3.显示进度条int i = 0;while (i <= 100){//-100为了保证左对齐,同时剩余位置添加空格,/r是使光标回到开头,覆盖掉上一次的进度条printf("[%-100s][%d%%][%c]\r", buff, i,lable[i%4]);fflush(stdout);usleep(100000);//0.1秒,每0.1秒显示一下进度条,每次进度条都会变化buff[i++]=STYLE;}printf("\n");}
//progress.hpp
#include <iostream>
#include <stdio.h>
#include <string.h>
void Run();

显示效果:
在这里插入图片描述

来看一下第二个版本

//progress.cc
#include <string.h>
#include <stdio.h>
#include <unistd.h>
#define BUFF_SIZE 102 //102是为了使最后的>能够存储,不至于越界
#define STYLE '='
#define ARR '>'
void Run()
{// 1.先定义一个缓冲区来存储进度条char buff[BUFF_SIZE]; // 需要101一个的原因是最后要添加\0// 清空,保证全为0,后续就不需要在进行修改memset(buff, 0, sizeof(buff));//2.设置动态的标志,保证进度条在运行char lable[5]="/|-\\";// 3.显示进度条int i = 0;while (i <= 100){//-100为了保证左对齐,同时剩余位置添加空格,/r是使光标回到开头,覆盖掉上一次的进度条printf("[%-100s][%d%%][%c]\r", buff, i,lable[i%4]);fflush(stdout);//刷新一下缓冲区,不然会无法正常显示出来usleep(100000);//0.1秒,每0.1秒显示一下进度条,每次进度条都会变化buff[i++]=STYLE;//if(i>100)也可以这样写,就可以不用把BUFF_SIZE设为102,101即可if(i!=100)buff[i]=ARR;//把最后一个显示为>,更加形象}printf("\n");}

这个版本仅仅是让进度条更好看点,如果大家愿意也可以添加颜色,作者就不在这演示了,防止大家在看代码时迷糊
在这里插入图片描述

🌸🌸Linux进度条实现的知识大概就讲到这里啦,博主后续会继续更新更多C++的相关知识,干货满满,如果觉得博主写的还不错的话,希望各位小伙伴不要吝啬手中的三连哦!你们的支持是博主坚持创作的动力!💪💪

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

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

相关文章

基于java线程池和EasyExcel实现数据异步导入

基于java线程池和EasyExcel实现数据异步导入 2.代码实现 2.1 controller层 PostMapping("import")public void importExcel(MultipartFile file) throws IOException {importService.importExcelAsync(file);}2.2 service层 Resource private SalariesListener sa…

校验收货地址是否超出配送范围实战3(day09)

优化用户下单功能&#xff0c;加入校验逻辑&#xff0c;如果用户的收货地址距离商家门店超出配送范围&#xff08;配送范围为5公里内&#xff09;&#xff0c;则下单失败。 提示&#xff1a; ​ 1. 基于百度地图开放平台实现&#xff08;https://lbsyun.baidu.com/&#xff09…

Linux系统下速通stm32的clion开发环境配置

陆陆续续搞这个已经很久了。 因为自己新电脑是linux系统无法使用keil&#xff0c;一开始想使用vscode里的eide但感觉不太好用&#xff1b;后面想直接使用cudeide但又不想妥协&#xff0c;想趁着这个机会把linux上的其他单片机开发配置也搞明白&#xff1b;而且非常想搞懂cmake…

leetcode_3092. 最高频率的 ID

https://leetcode.cn/problems/most-frequent-ids/description/ 看到这个数据范围 最极端情况 如果nums全为一个数 并且数量取到最大 那么范围是10的10次方 需要longlong储存 这题主要运用了哈希表配合multiset实现 哈希表主要用作存储某个数的出现次数 mst则用于记录出现次…

【深度学习】 自动微分

自动微分 正如上节所说&#xff0c;求导是几乎所有深度学习优化算法的关键步骤。 虽然求导的计算很简单&#xff0c;只需要一些基本的微积分。 但对于复杂的模型&#xff0c;手工进行更新是一件很痛苦的事情&#xff08;而且经常容易出错&#xff09;。 深度学习框架通过自动…

如何把jupyter的一个.ipynb文件的多个单元格cell合并为1个cell

1 jupyter的一个.ipynb文件的多个单元格cell合并为1个cell 步骤 1&#xff1a;打开 your_notebook.ipynb 文件 启动 Jupyter Notebook。 导航到你的工作目录&#xff08;例如 F:\main&#xff09;。 打开 your_notebook.ipynb 文件。 步骤 2&#xff1a;选择所有单元格 点击…

集成Sleuth实现链路追踪

文章目录 1.新增sunrays-common-cloud模块1.在sunrays-framework下创建2.pom.xml3.查看是否被sunrays-framework管理 2.创建common-cloud-sleuth-starter1.目录结构2.pom.xml3.sunrays-dependencies指定cloud版本4.SleuthAutoConfiguration.java5.spring.factories 3.创建commo…

WPF基础 | 初探 WPF:理解其核心架构与开发环境搭建

WPF基础 | 初探 WPF&#xff1a;理解其核心架构与开发环境搭建 一、前言二、WPF 核心架构2.1 核心组件2.2 布局系统2.3 数据绑定机制2.4 事件处理机制 三、WPF 开发环境搭建3.1 安装 Visual Studio3.2 创建第一个 WPF 应用程序 结束语优质源码分享 WPF基础 | 初探 WPF&#xff…

字节跳动自研HTTP开源框架Hertz简介附使用示例

字节跳动自研 HTTP 框架 Hertz Hertz 是字节跳动自研的高性能 HTTP 框架&#xff0c;专为高并发、低延迟的场景设计。它基于 Go 语言开发&#xff0c;结合了字节跳动在微服务架构中的实践经验&#xff0c;旨在提供更高效的 HTTP 服务开发体验。 1. 背景介绍 随着字节跳动业务…

实战演示:利用ChatGPT高效撰写论文

在当今学术界&#xff0c;撰写论文是一项必不可少的技能。然而&#xff0c;许多研究人员和学生在写作过程中常常感到困惑和压力。幸运的是&#xff0c;人工智能的快速发展为我们提供了新的工具&#xff0c;其中ChatGPT便是一个优秀的选择。本文将通过易创AI创作平台&#xff0c…

在线可编辑Excel

1. Handsontable 特点&#xff1a; 提供了类似 Excel 的表格编辑体验&#xff0c;包括单元格样式、公式计算、数据验证等功能。 支持多种插件&#xff0c;如筛选、排序、合并单元格等。 轻量级且易于集成到现有项目中。 具备强大的自定义能力&#xff0c;可以调整外观和行为…

spring-springboot -springcloud

目录 spring: 动态代理: spring的生命周期(bean的生命周期): SpringMvc的生命周期: SpringBoot: 自动装配: 自动装配流程: Spring中常用的注解&#xff1a; Spring Boot中常用的注解&#xff1a; SpringCloud: 1. 注册中心: 2. gateway(网关): 3. Ribbon(负载均…

DAY9,递归实现计算 :1 + 1/3 - 1/5 + 1/7 - 1/9 + .... 1/n 的值

题目 用递归实现计算 :1 1/3 - 1/5 1/7 - 1/9 .... 1/n 的值&#xff0c;n通过键盘输入 思路 递进阶段&#xff1a;n、...... 、9、7、5、3、1 函数出口&#xff1a;递进到1 开始返回&#xff1b;函数返回值视为“总和” 回归阶段&#xff1a;对当前n取倒数&#xff1b;“总…

Formality:不可读(unread)的概念

相关阅读 Formalityhttps://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482https://blog.csdn.net/weixin_45791458/category_12841971.html?spm1001.2014.3001.5482 在Formality中有时会遇到不可读(unread)这个概念&#xff0c;本文就将对此…

【27】Word:徐雅雯-艺术史文章❗

目录 题目​ NO1.2 NO3 NO4 NO5 NO6.7 NO8.9 NO10.11 注意&#xff1a;修改样式的字体颜色/字号&#xff0c;若中英文一致&#xff0c;选择所有脚本。格式相似的文本→检查多选/漏选格式刷F4重复上一步操作请❗每一步检查和保存 题目 NO1.2 F12另存为布局→行号布局…

关于ARM和汇编语言

一图流 ARM 计算机组成 输入设备 输出设备 存储设备 运算器 控制器 处理器读取内存程序执行的过程 取指阶段&#xff1a;控制器器通过地址总线向存储器发送想要获取的指令的地址编号&#xff0c;存储器将指定的指令发送给处理器 译码阶段&#xff1a;控制器对指令进行分…

PyTorch使用教程(9)-使用profiler进行模型性能分析

1、简介 PyTorch Profiler是一个内置的性能分析工具&#xff0c;可以帮助开发者定位计算资源&#xff08;如CPU、GPU&#xff09;的瓶颈&#xff0c;从而更好地优化PyTorch程序。通过捕获和分析GPU的计算、内存和带宽利用情况&#xff0c;能够有效识别并解决性能瓶颈。 2、原…

2025-01-22 Unity Editor 1 —— MenuItem 入门

文章目录 1 Editor 文件夹2 MenuItem3 使用示例3.1 打开网址3.2 打开文件夹3.3 Menu Toggle3.4 Menu 代码复用3.5 MenuItem 激活与失活4 代码示例 1 Editor 文件夹 ​ Editor 文件夹是 Unity 中的特殊文件夹&#xff0c;Unity 中所有编辑器相关的脚本都需要放置在其中&#xf…

docker 安装 mysql 详解

在平常的开发工作中&#xff0c;我们经常需要用到 mysql 数据库。那么在docker容器中&#xff0c;应该怎么安装mysql数据库呢。简单来说&#xff0c;第一步&#xff1a;拉取镜像&#xff1b;第二步&#xff1a;创建挂载目录并设置 my.conf&#xff1b;第三步&#xff1a;启动容…

linux-samba服务配置与应用

1.了解samba的配置文件 2.熟悉samba服务的实例 以前我们在windows上共享文件的话&#xff0c;只需右击要共享的文件夹&#xff0c;然后选择共享相关的选项设置即可&#xff0c;然后如何实现windows和linux的文件共享呢&#xff0c;这就涉及到了samba服务&#xff0c;这个软件…