Linux实现简单进度条(附原理解释和动图效果)

news2024/10/6 10:35:33

1,行缓冲区

先看下面的代码和运行结果,

#include<stdio.h>
#include<unistd.h>
int main()
{
  printf("你好\n");
  sleep(3);
  return 0;
}

只是一个简单的打印“你好”然后休眠三秒,最后程序结束

再看下面的代码和运行结果: 

#include<stdio.h>
#include<unistd.h>
int main()
{
  printf("你好");
  sleep(3);
  return 0;
}

这串代码中我们把printf里面的 ' \n ' ,去掉了,那么运行结果就不同了,就变成了先休眠三秒,然后再打印的“你好”。该现象证明了,打印的时候,系统和屏幕中间是存在缓冲区的。

显示器对应的是行刷新,就是当缓冲区写满或者代码执行时遇到 ' \n ' 时,才会显示到屏幕上,至于原因我们到IO流部分会详细讲解,目前阶段可以通过“Linux下一切皆文件”的概念把屏幕也看成一个文件。  所以上面的第二个代码是先休眠三秒然后程序结束前把缓冲区数据刷新到屏幕上。

2,\n 与 \r

\n:我们很熟悉,就是换行

\r:这个我们用的不多,它表示使光标回到本行行首

简单来说,我们键盘上的回车键也就是Enter,按下代表 ‘ \n+\r ’。所以 \r代表回到本行行首,那么我们可以简单写一个程序,使运行后在同一个位置打印1 - 10,不换行,覆盖打印,如下代码

#include<stdio.h>
#include<unistd.h>
int main()
{
  int i = 1;
  for(i = 1; i <= 10; i++)
  {
    printf("%d\r", i);
    fflush(stdout); //ffush表示强制刷新缓冲区,是刷新缓冲器的形式之一,其他刷新缓冲区的策略我们到文件系统再详细展开
    sleep(1);
  }
  return 0;
}

3,进度条代码和展示

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

#define NUM 102

int main()
{
    char bar[NUM];
    memset(bar,0,sizeof(bar));
    const char* lable="|/-\\"; //进度条后面4个符号
    int cnt =0;
    while(cnt <= 100)
    {
       // printf("%s\n",bar);//打印,但是分行打印
        printf("[%-100s][%d%%] %c\r",bar,cnt,lable[cnt%4]); //利用\r,实现覆盖打印
        bar[cnt++] = '#';
        fflush(stdout);
        usleep(50000); //以后时间可以根据需求自定义
    }
    printf("\n"); //换行,防止最后shell的命令提示符信息覆盖掉进度条打印
    return 0;
}

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

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

相关文章

LT6911UXE HDMI 2.0 至双端口 MIPI DSI/CSI,带音频 龙迅方案

1. 描述LT6911UXE 是一款高性能 HDMI2.0 至 MIPI DSI/CSI 转换器&#xff0c;适用于 VR、智能手机和显示应用。HDMI2.0 输入支持高达 6Gbps 的数据速率&#xff0c;可为4k60Hz视频提供足够的带宽。此外&#xff0c;数据解密还支持 HDCP2.3。对于 MIPI DSI / CSI 输出&#xff0…

Linux学习之Tcp与Udp

目录 UDP Udp协议的格式 UDP的传输特性 UDP的缓冲区 基于UDP的应用层协议 TCP协议 TCP的报文格式 1.ACK确认应答机制 2.超时重传 3.TCP的链接管理机制 为什么要三次握手呢&#xff1f; 理解TIME_WAIT状态 流量控制&#xff08;可靠性效率&#xff09; 滑动窗口 拥塞…

C++栈和队列模拟

栈和队列所用的容器默认都为deque&#xff0c;这种容器可以看作是一种vector和list的中间性能容器。 而deque虽然头插、尾插效率很好&#xff0c;且支持 [ ] 访问&#xff08;默认容器为它的原因&#xff09;&#xff0c;但是 他的缺点也很明显&#xff1a; 1.中间插入删除会…

【C++算法竞赛 · 图论】树

目录 前言 树 树的定义 树的相关概念 树的遍历 1 先序遍历 2 中序遍历 3 后序遍历 前言 前两篇文章&#xff08;【C算法竞赛 图论】图论基础、【C算法竞赛 图论】图的存储&#xff09;中&#xff0c;介绍了图的相关概念与存储&#xff0c;还不了解的可以去补补课。 …

【百度Apollo】探索自动驾驶:小白教学如何使用 Dreamview 播放数据包

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《linux深造日志》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 文章目录 引入一、Dreamview 简介二、使用 Dreamview 具体步骤步骤一&#xff1a;进入 Apollo Docker 环境步骤二&#xff…

数学建模--图论最短路径基础

1.图的定义 学过数据结构或者离散数学的小伙伴们应该知道图的概念&#xff0c;我在这里简单的介绍一下&#xff1a; 图的概念和我们理解的是很不一样的&#xff0c;这里的图并不是我们的生活里面的图片&#xff0c;而是一种表示不同的数据之间的关系&#xff0c;例如这里的5个…

hive使用hplsql进行etl或其它数据加工

参照 https://cwiki.apache.org/confluence/pages/viewpage.action?pageId59690156 http://www.hplsql.org/doc Hive HPL/SQL&#xff0c;即Hive Hybrid Procedural SQL一个开源工具&#xff0c;它为hive实现了过程性的SQL功能&#xff0c;类似Oracle的PLSQL。从hive 2.0.0开…

电机控制系列模块解析(12)—— 过调制

一、过调制 电机控制中的过调制&#xff08;Overmodulation&#xff09;是指在实施脉宽调制&#xff08;PWM&#xff09;过程中&#xff0c;使调制指数&#xff08;调制深度&#xff09;超过常规线性调制区的极限&#xff0c;进入非线性调制区域。这一策略通常应用于诸如空间矢…

NIO(非阻塞I/O)和IO(阻塞I/O)详解

文章目录 一、NIO&#xff08;Non-blocking I/O&#xff0c;非阻塞I/O&#xff09;1、Channel&#xff08;通道&#xff09;与Buffer&#xff08;缓冲区&#xff09;1.1、使用ByteBuffer读取文件1.2、ByteBuffer 方法1.2、ByteBuffer 结构1.3、字符串与 ByteBuffer 互转1.4 Sca…

Android 音视频播放器 Demo(一)—— 视频解码与渲染

本篇作为 Android 音视频实战系列的第二篇文章&#xff0c;主要介绍视频解码与渲染过程。本系列文章目录如下&#xff1a; Android 音视频基础知识 Android 音视频播放器 Demo&#xff08;一&#xff09;—— 视频解码与渲染 Android 音视频播放器 Demo&#xff08;二&#xff…

数据结构-链表练习(面试题)

1&#xff0c;翻转一个单链表 建立变量cur指向第二个节点&#xff0c;curN指向cur.next&#xff0c;将第二个节点的next改为head&#xff0c;headcur这样实现&#xff0c;前两个节点顺序的翻转&#xff0c;第二个节点指向了第一个节点&#xff0c;之后cur向后移&#xff08;cu…

linux中 虚拟机 修改时间 centos7

方法1 &#xff1a;虚拟机内 设置 方法2 代码实现 timedatectl set-timezone "Asia/Shanghai"

Detla lake with Java--在spark集群上运行程序

昨天写了第一篇入门&#xff0c;今天看见有人收藏&#xff0c;继续努力学习下去。今天要实现的内容是如何将昨天的HelloDetlaLake 在spark集群上运行&#xff0c;。具体步骤如下 1、安装spark,我使用的是 spark-3.5.1-bin-hadoop3-scala2.13&#xff0c;去官网下载&#xff0c…

Secure CRT 文件传输

Secure CRT 文件传输 Secure CRT支持多种文件传输协议&#xff0c;其中最常用的是Xmodem、Ymodem、Zmodem和Kermit。这些协议允许在本地计算机和远程主机之间安全地传输文件。 Xmodem&#xff1a; Xmodem是一种简单的协议&#xff0c;通常用于在串行连接上进行文件传输。它通过…

【程序错误-显存不足】RuntimeError: CUDA out of memory. Tried to allocate 4.00 GiB

目录 1. 问题2. 解决方法2.1 租服务器(试过有用)2.2 减小batchsize2.3 减少模型大小2.3 检查模型本身没有发现错误&#xff0c;最终确认是验证集评估阶段的张量计算非常占用空间。2.3.1 可以对利用torch.tensor().detach().cpu().numpy()转为numpy&#xff0c;在cpu上进行loss和…

学习Rust的第22天:mini_grep第2部分

书接上文&#xff0c;在本文中&#xff0c;我们学习了如何通过将 Rust 程序的逻辑移至单独的库箱中并采用测试驱动开发 (TDD) 实践来重构 Rust 程序。通过在实现功能之前编写测试&#xff0c;我们确保了代码的可靠性。我们涵盖了基本的 Rust 概念&#xff0c;例如错误处理、环境…

【ARM Cache 系列文章 11.2 -- ARM Cache 组相联映射】

请阅读【ARM Cache 系列文章专栏导读】 文章目录 Cache 组相联映射组相联映射原理多路组相连缓存的优势多路组相连缓存的代价关联度&#xff08;Associativity&#xff09; 上篇文章&#xff1a;【ARM Cache 系列文章 11.1 – ARM Cache 全相连 详细介绍】 Cache 组相联映射 A…

文章解读与仿真程序复现思路——电力自动化设备EI\CSCD\北大核心《计及多重不确定性的虚拟电厂响应区间评估方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 论文与完整源程序_电网论文源程序的博客-CSDN博客https://blog.csdn.net/liang674027206/category_12531414.html 电网论文源程序-CSDN博客电网论文源…

mysql-sql-练习题-4-标记

标记 连续登录2-7天用户建表排名找规律 最大连胜次数建表只输出连胜结果输出所有连续结果 连续登录2-7天用户 建表 create table continuous_login(user_id1 integer comment 用户id,date_login date comment 登陆日期 ) comment 用户登录表;insert into continuous_login val…

【Java基础】Spring核心之控制反转(IOC)

1. 如何理解IOC 1.1 什么是IOC 在Spring框架中&#xff0c;IOC&#xff08;Inversion of Control&#xff0c;控制反转&#xff09;是一种设计原则&#xff0c;它是Spring框架的核心概念之一。IOC的基本思想是将程序的控制权从应用程序代码中转移到框架或容器中&#xff0c;从…