【linux】进度条

news2024/11/19 2:05:08

Alt

🔥个人主页Quitecoder

🔥专栏linux笔记仓

Alt

目录

    • 01.屏幕缓冲区
      • 换行(LF, `\n`)和回车(CR, `\r`)
      • 换行回车在屏幕缓冲区中的作用
        • 代码块1:
        • 代码块2:
    • 02.进度条
      • 优化版本

01.屏幕缓冲区

屏幕缓冲区是指在输出设备(如终端或控制台)之前,数据被存储的内存区域。应用程序将输出数据写入这个缓冲区,然后系统统一将缓冲区的内容刷新到屏幕上。缓冲区的使用提高了I/O操作的效率,因为它允许数据批量刷新,而不是每次输出都进行一次I/O操作。

缓冲区刷新模式

缓冲区的刷新模式决定了什么时候会将缓冲区内容刷新到终端屏幕上。主要有以下几种模式:

  1. 全缓冲模式(Fully Buffered)

    • 数据只有在缓冲区满时才会被刷新到屏幕上。通常用于文件I/O。
  2. 行缓冲模式(Line Buffered)

    • 当遇到换行字符(LF, \n)时,缓冲区内容会被刷新到屏幕上。常见于终端I/O
    • 一些标准输出流(如stdout)在连接到终端时默认使用行缓冲模式。
  3. 无缓冲模式(Unbuffered)

    • 数据每次写入缓冲区后立即被刷新到屏幕上。适用于需要实时输出的场景,如错误输出流(如stderr)通常是无缓冲的。

换行(LF, \n)和回车(CR, \r

在屏幕缓冲区的刷新以及终端输出中,换行字符和回车字符有着重要的作用:

  1. 换行(Line Feed, \n

    • 功能:将光标移到下一行。
    • 在行缓冲模式下
      • 当输出流遇到换行字符时,缓冲区的内容会被立即刷新到屏幕上,从而实现行缓冲的机制
      • 在许多现代终端和编程环境中,输出一个换行字符通常意味着会将当前行的数据刷新到屏幕
  2. 回车(Carriage Return, \r

    • 功能将光标移动到当前行的起始位置(即行首),但不移动到下一行
    • 用途
      • 常用于覆盖同一行内容,如进度条或动态日志输出。输出回车字符后,下一次的输出会从行首开始,覆盖当前行的内容

换行回车在屏幕缓冲区中的作用

  • 行缓冲模式换行字符(\n)会触发缓冲区刷新,将内容显示到屏幕上。

  • 回车字符(\r不触发缓冲区刷新,而是移动光标,通常与手动刷新缓冲区结合使用,以实现动态行更新。

  • 缓冲区刷新模式(全缓冲、行缓冲和无缓冲)控制了何时将数据从缓冲区刷新到屏幕。

  • 换行字符(\n)在行缓冲模式下起到触发缓冲区刷新的作用,同时将光标移到下一行。

  • 回车字符(\r)将光标移动到行首,常用于覆盖当前行的内容,而不触发缓冲区刷新。

  • 综合使用换行和回车字符,可以实现灵活的终端输出效果,特别在实时显示和动态更新场景中非常常见。

从您提供的代码来看,您有两个几乎相同的代码块,但你希望了解的现象可能是与终端缓冲和输出可见性相关的。让我们总结并推测可能的观察现象。

代码块1:
#include <stdio.h>
#include <unistd.h>  // For sleep()

int main() {
    printf("hello Makefile!\n");
    sleep(3);
    return 0;
}
代码块2:
#include <stdio.h>
#include <unistd.h>  // For sleep()

int main() {
    printf("hello Makefile!");
    sleep(3);
    return 0;
}

终端输出现象

代码块1:

printf("hello Makefile!\n");
  • 输出字符串 “hello Makefile!” 后接换行符 \n
  • 在行缓冲模式下,遇到 \n 立即刷新输出缓冲区内容到终端。
  • 您会立即看到 “hello Makefile!” 和换行,接下来程序会暂停3秒钟,然后退出。

终端显示:

hello Makefile!

(暂停3秒钟)

代码块2:

printf("hello Makefile!");
  • 输出字符串 “hello Makefile!”,但没有换行符 \n
  • 在行缓冲模式下,由于没有遇到 \n,缓冲区不立即刷新到终端,除非缓冲区满或者进程结束。
  • 因为接下来代码调用 sleep(3) 而没有刷新缓冲区,所以在大多数情况下,您在终端上可能看不到立即的输出。
  • 直到程序退出或缓冲区被手动刷新,“hello Makefile!” 的内容才会显示。

终端显示:

(暂停3秒钟)
hello Makefile!

如果你希望在没有换行符的情况下立即刷新输出缓冲区,可以在 printf 后调用 fflush(stdout)

修改后的代码块2:

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("hello Makefile!");
    fflush(stdout);    // 手动刷新标准输出缓冲区
    sleep(3);
    return 0;
}

这样做确保 “hello Makefile!” 会立即显示在终端上,不需要等到程序退出或缓冲区满。

终端显示:

hello Makefile!
(暂停3秒钟)
  • 带有换行符 \nprintf 在行缓冲模式下会立即刷新到终端。
  • 没有换行符的 printf 可能不会立即刷新缓冲区,需要手动调用 fflush(stdout)
  • 使用 \nfflush(stdout) 确保输出立即可见,尤其是在待运行一段时间的代码(如 sleep())之后进行输出时。

这些现象主要源于终端缓冲机制的行为,在不同开发和调试环境中(特别是高速输出场景下)理解这些机制尤其有用。

02.进度条

有了上面缓冲区的知识,我们就可以实现一个简易版的进度条

在这里插入图片描述
文件结构如下
在这里插入图片描述

在这里插入图片描述
准备工作完成后,我们下面只需完成进度条的主体代码即可

#include"Processbar.h"
#include<string.h>
#include<unistd.h>

#define length 101
#define Style '#' 

void Procbar()
{
  char bar[101];
  memset(bar,'\0',sizeof(bar));
  int cnt=0;
  while(cnt<=100)
  {
    printf("[%-100s][%d%%]\r",bar,cnt);
    fflush(stdout);
    bar[cnt++]=Style;
    usleep(10000);
  }
  printf("\n");
}

进度条显示函数 Procbar

  • char bar[length];:声明一个字符数组 bar,长度为 length(101 个字符),用于存储进度条的内容。
  • memset(bar, '\0', sizeof(bar));:将 bar 数组的所有元素初始化为\0表示进度条初始为空
  • int cnt = 0;:初始化一个整型变量 cnt,作为进度百分比,从0开始。
  • while(cnt <= 100):使用 while 循环,将 cnt 从0逐步增到100,模拟从0%到100%的进度条显示。
    • printf("[%-100s][%d%%]\r", bar, cnt);格式化输出进度条。%-100s表示左对齐,宽度为100的字符串,%d%%表示当前的百分比。\r 让光标返回行首
    • fflush(stdout);刷新标准输出,使得进度条及时更新
    • bar[cnt++] = Style;bar 数组的第 cnt 个位置设置为 #,并将 cnt 递增1,表示进度条推进一格
    • usleep(10000);:暂停程序10毫秒,以模拟进度条的动态效果。
  • printf("\n");循环结束后,打印一个换行符,结束进度条的显示

优化版本

在这里插入图片描述
我们设置文件大小和带宽速度,这时候进度条的函数需要进行修改

  1 #include"Processbar.h"
  2 #include<unistd.h>
  3 
  4 void download()
  5 {
  6   double filesize=100*1024*1024*1.0;
  7   double current=0.0;
  8   double bandwidth=1024*1024*1.0;
  9   printf("download begin,current: %lf\n",current);
 10   while(current<=filesize)
 11   {
 12     Procbar(filesize,current);
 13     current+=bandwidth;
 14     usleep(10000);
 15   }                                                                                                                   
 16 
 17   printf("\ndownload done ,filesize: %lf\n",filesize);
 18 }
 19 int main()
 20 {
 21  // download();
 22  // Procbar(100.0,69.0);
 23    download();
 24   return 0;
 25 }

  1 #include"Processbar.h"
  2 #include<string.h>
  3 #include<unistd.h>
  4 
  5 #define length 101
  6 #define Style '#' 
  7 
  8 void Procbar(double total,double current)
  9 {
 10   char bar[101];
 11 
 12   memset(bar,'\0',sizeof(bar));
 13   int cnt=0;
 14   double rate = (current*100.0)/total;
 15   int loop_count =(int)rate;
 16 
 17   while(cnt<=loop_count)
 18   {
 19     bar[cnt++]=Style;
 20   }                                                                                                                   
 21    printf("[%-100s][%.1lf%%]\r",bar,rate);
 22    fflush(stdout);
 23 }

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

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

相关文章

SpringBoot3+Swagger3(最新版springdoc-openapi教程)

第一步&#xff1a;引入springdoc-openapi依赖 <dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.6.0</version></dependency> 第二步&#xff1a; 配置…

打开ffmpeg编码器的时候报错:avcodec_open2()返回-22

[h264_v4l2m2m 0x555555617a00] Could not find a valid device [h264_v4l2m2m 0x555555617a00] cant configure encoder 前言&#xff1a;先做一个操作&#xff0c;查找编码器的时候&#xff0c;使用名字查找的方式&#xff1a; const AVCodec *avcodec_find_encoder_by_n…

ubuntu数据硬盘故障导致系统启动失败

背景&#xff1a; 系统盘损坏或者/etc/fatab误修改导致开机启动挂载失败系统无法启动 解决方法 重启

BFS 解决最短路径问题, 迷宫中离入口最近的出口,最小基因变化,单词接龙,为高尔夫比赛砍树

文章目录 1926. 迷宫中离入口最近的出口433. 最小基因变化127. 单词接龙675. 为高尔夫比赛砍树 1926. 迷宫中离入口最近的出口 边权为1的最短路径问题 我们要知道上下左右都是可以走的 &#xff08;用队列&#xff09;走过的地方不要在走了&#xff0c;这样会进入死循环&#x…

零信任内网安全访问

随着互联网的持续发展&#xff0c;便捷的共享方式极大地提高了企业的生产力和工作效率&#xff0c;但随之也给企业内网带来了极大的安全隐患。企业内网承载大量的核心资产和机密数据&#xff0c;一旦受到攻击可能会造成大量损失&#xff0c;因此&#xff0c;如何通过零信任内网…

快手一面:给定一棵二叉树,要求将其转换为其镜像?

目录标题 题解&#xff1a;二叉树的镜像&#xff08;Invert Binary Tree&#xff09;问题描述示例解题思路代码实现详细分析复杂度分析优点注意事项&#x1f495; 题解&#xff1a;二叉树的镜像&#xff08;Invert Binary Tree&#xff09; 问题描述 给定一棵二叉树&#xff…

探索AI新纪元:揭秘Mammoth库的神秘面纱

文章目录 探索AI新纪元&#xff1a;揭秘Mammoth库的神秘面纱背景&#xff1a;为何选择Mammoth&#xff1f;简介&#xff1a;Mammoth是什么&#xff1f;安装&#xff1a;如何获取Mammoth&#xff1f;使用&#xff1a;Mammoth的基本函数场景应用&#xff1a;Mammoth在实际中的运用…

基于Python大数据的B站热门视频的数据分析及可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码 精品专栏&#xff1a;Java精选实战项目…

宠物空气净化器和普通的空气净化器有区别吗?哪款能吸猫毛

这不是国庆节要来了吗&#xff0c;想着假期变多了可以多陪一下自家的小猫咪&#xff0c;但是也怕猫咪的毛发太多让我产生退缩的念头。 刚开始养的时候&#xff0c;我就知道猫咪是会掉毛的&#xff0c;毕竟猫咪的毛发这么旺盛&#xff0c;掉毛也是正常的&#xff0c;但是我似乎…

SpringCloud源码:客户端分析(二)- 客户端源码分析

背景 我们继续分析EurekaClient的两个自动化配置类&#xff1a; 自动化配置类功能职责EurekaClientAutoConfiguration配置EurekaClient确保了Eureka客户端能够正确地&#xff1a;- 注册到Eureka服务端- 周期性地发送心跳信息来更新服务租约- 下线时通知Eureka服务端- 获取服务实…

Qt网络编程——QUdpSocket

文章目录 Qt网络编程QUdpSocketUdp回显服务器Udp客户端 Qt网络编程 网络编程本质上是写应用层代码&#xff0c;需要传输层提供支持。 而传输层最核心的协议就是UDP和TCP&#xff0c;这两个协议有较大差别&#xff0c;所以Qt提供了两套API。 要是有Qt网络编程的API&#xff0…

9.23-9.25学习

前置知识 docker&#xff1a;Docker-CSDN博客 docker安装mysql和 redis&#xff1a;https://blog.csdn.net/weixin_73118927/article/details/142530243?fromshareblogdetail&sharetypeblogdetail&sharerId142530243&sharereferPC&sharesourceweixin_7311892…

从预测性维护到智能物流:ARM边缘计算控制器的工业实践

工业4.0时代的到来&#xff0c;边缘计算技术成为连接物理世界与数字世界的桥梁。ARM架构的边缘计算控制器凭借其低功耗、高能效和灵活性等特点&#xff0c;在工业自动化领域展现出巨大潜力。本文将通过几个实际应用案例来探讨ARM边缘计算控制器是如何提升生产线效率和安全性的&…

03DSP学习-利用syscfg配置IO

上一篇博客介绍了syscfg&#xff0c;对syscfg有了初步的了解&#xff0c;但是在真正使用上它之前&#xff0c;还不能理解他是一个神器。 (在写博客的时候&#xff0c;我是在从头到尾重新完成这个步骤&#xff0c;希望对初学者有点帮助) 找到Board Component 打开syscfg文件&…

【Tourism】Yuncheng(4)

文章目录 1、永乐宫&#xff08;AAAA&#xff09;2、寿圣寺3、城隍庙4、池神庙 1、永乐宫&#xff08;AAAA&#xff09; 永乐宫&#xff0c;原名大纯阳万寿宫&#xff0c;位于山西省运城市芮城县以北约三公里处的龙泉村东&#xff0c;是为纪念八仙之一吕洞宾而修建的一座道教宫…

VR虚拟展厅可以在手机上打开吗?

虚拟展厅是可以在手机上打开的。 随着数字技术和虚拟现实技术的不断发展&#xff0c;虚拟展厅已经实现了多平台无缝对接&#xff0c;包括手机、平板、电脑等多种电子设备。具体来说&#xff0c;虚拟展厅通常采用HTML5360全景架构&#xff0c;这种架构使得虚拟展厅不需要安装任…

Mac优化清理工具CleanMyMac X 4.15.6 for mac中文版

CleanMyMac X 4.15.6 for mac中文版下载是一款功能更加强大的系统优化清理工具&#xff0c;软件只需两个简单步骤就可以把系统里那些乱七八糟的无用文件统统清理掉&#xff0c;节省宝贵的磁盘空间。CleanMyMac X 4.15.6 for mac 软件与最新macOS系统更加兼容&#xff0c;流畅地…

2024年配置YOLOX运行环境+windows+pycharm24.0.1+GPU

1.配置时间2024/9/25 2.Anaconda-python版本3.7&#xff0c;yolox版本0.2.0 YOLOX网址: https://github.com/Megvii-BaseDetection/YOLOX 本人下载的这个版本 1.创建虚拟环境 conda create -n yolox37 python37 激活 conda activate yolox37 2.安装Pytorch cuda等&…

vue路由的基本使用

文章目录 1.路由的基本使用2.路由的默认路径3.嵌套路由4.路由懒加载5.动态路由匹配 1.路由的基本使用 安装 vue-router&#xff1a; npm install vue-router创建路由文件&#xff1a; 在 src 目录下创建 router 目录&#xff0c;并在其中创建 index.js 文件。 在 main.js 中使…

【Linux操作系统】进程优先级

目录 一、为什么要有优先级二、进程优先级1.进程优先级的基本概念2.进程优先级的表现形式3. 默认优先级4.进程优先级的修改5.为什么调整优先级是要受限制的&#xff1f; 一、为什么要有优先级 在学习进程优先级之前&#xff0c;我们要先知道为什么会出现进程优先级这个东西 从…