linux小程序—进度条(动态演示)

news2024/11/30 10:47:36

文章目录

  • 1. \n与\r的区别
    • 1. linux环境下
    • 2. windows环境下
  • 2. 缓冲区问题
    • 1.\n的情况
    • 2.\r的情况
    • 3. \n与\r的情况对比
    • 4. 使用fflush函数观察\r情况
    • 5. 不为\n与\r的情况
  • 3.进度条的实现
    • 1. printf 打印字符问题
      • 1. 修改前
      • 2.修改后
    • 2 . 注意事项
    • 3. 整体实现
      • 1. makefile(自动化编译工具)
      • 2. proc.c(函数的实现)
      • 3.proc.h(函数的定义与头文件)
      • 4. main.c(主函数)
    • 3. 动态图展示

1. \n与\r的区别

1. linux环境下

下面的演示皆在linux环境下

\n:换行
在这里插入图片描述

  • 在linux下,使用\n后光标会来到下一行与之平行的位置

\r:回车
在这里插入图片描述

  • 在linux中,使用\r会使光标回到这一行开头的位置

2. windows环境下

在这里插入图片描述

  • 在VS中,使用\n实际上起到回车+换行的作用, \n默认为\r\n

2. 缓冲区问题

1.\n的情况

在这里插入图片描述

>当使用 hello world\n时,发现会直接打印出 hello world

2.\r的情况

为了方便观察 ,使用一个休眠函数sleep,使其休眠1秒,发现最终什么也打印出不来

在这里插入图片描述

3. \n与\r的情况对比

  • 对比\n与\r的两种情况,实际上是因为行缓冲区的存在导致的,在\n的程序中,\n有刷新缓冲区的作用,所以会立即显示hello world
  • 而在\r的程序中,在使用printf函数时,每打印一个字符,光标就会往后移动,但是遇见\r时,光标会回到该行的开头位置,最后被命令行提示符覆盖掉

4. 使用fflush函数观察\r情况

  • 为了刚好观察这一现象,我们把fflush 函数(作用为刷新缓冲区)放入printf函数与sleep函数休眠之间,
    fflush(stdout)
    stdout为标准输出流

    在这里插入图片描述

此时可以清楚的观察到,是先运行printf函数,遇见\r使光标回到该行的开头,然后才被命令提示符覆盖

5. 不为\n与\r的情况

在这里插入图片描述
此时发现结果竟然是先休眠,然后才先出来hello world ,
难道是执行的sleep函数, 再去执行的printf函数吗?

当然不是!
c语言中一定是自上而下运行的,所以一定先执行printf函数,在执行sleep休眠,
由于hello world 没有被刷新,在sleep期间hello world一直保留在缓冲区中,
直到程序结束,系统自动刷新缓冲区,所以在休眠2秒后显示hello world

3.进度条的实现

1. printf 打印字符问题

1. 修改前

在这里插入图片描述

当我们使用\r 及fflush函数,去实现一个从10开始显示的倒数实现
发现使用%d输出后,printf函数打印出了实际上是以字符的形式体现的,10可以看作是两个字符,而9是一个字符,所以只会替换掉字符1的位置,打印出 9 0 两个字符
所以要使用%2d,覆盖2个字符位置使其右对齐

2.修改后

在这里插入图片描述
使用%2d后,使其修改两个字符,若为一个字符时,右对齐

2 . 注意事项

  • 创建一个字符串,使用\r,每次输出#后,返回该行的开头,并在下次循环使用##替换掉#,并以此循环下去
  • 使用printf(“\n”); 是为了防止最后显示的命令提示符覆盖掉输出的结果
  • 使用memset进行初始化,字符数组开辟101个空间是因为字符串最后以\0结尾,而全部初始化为\0,就不用再结尾考虑\0的问题了
  • 使用%-100s ,是为了让#从左开始打印,并且没有打印的地方预留出空白区域
    -usleep函数是以微妙为单位进行
    1秒=10^6微妙 100000微秒=0.1秒 设置以0.1秒为间隔

3. 整体实现

1. makefile(自动化编译工具)

  1 myproc: main.c proc.c
  2     gcc -o myproc main.c proc.c
  3 .PHONY:clean
  4 clean:
  5   rm -f myproc     

2. proc.c(函数的实现)

 #include"proc.h"
  2 #define size 101
  3 void process()
  4 {
  5   char arr[size];
  6   memset(arr,'\0',sizeof(char)*size);//全部 初始化为'\0'
  7   char str[]="|/-\\";
  8   int i=0;
  9   for(i=0;i<=100;i++)
 10   {
 11     arr[i]='#';
 12      printf("[%-100s][%d%%][%c]\r",arr,i,str[i%4]);
 13      fflush(stdout);//刷新缓冲区
 14      usleep(100000);//间隔0.1秒输出
 15   }
 16   printf("\n");
 17 } 

3.proc.h(函数的定义与头文件)

 #include<stdio.h>
  2 #include<unistd.h>//usleep函数
  3 #include<string.h>     

4. main.c(主函数)

#include"proc.h"
    2 int main()
    3 {
    4   process();
    5   return 0;                                                                                                                                       
    6 }

3. 动态图展示

在这里插入图片描述

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

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

相关文章

一篇文章教会你Linux下《常用操作指令》

基本指令首言ls&#xff08;查看目录&#xff09;pwds&#xff08;显示用户当前所在目录&#xff09;cd&#xff08;改变工作目录&#xff09;mkdir&#xff08;创建目录&#xff09;rmdir&#xff08;删除目录&#xff09;touch &#xff08;新建文件或更新文件时间&#xff0…

【Python】获取视频弹幕并生成词云

目录一、摘要二、获取目标视频cid三、获取视频弹幕xml文件四、处理弹幕文件五、生成词云六、完整参考代码一、摘要 就是那个大家都用的弹幕视频网站&#xff0c;不写名字了&#xff0c;写了老是不能通过。 获取视频的弹幕文件&#xff08;xml&#xff09;&#xff0c;并生成如图…

认真分享一个让我变厉害的小建议

很多朋友&#xff0c;加我好友之后&#xff0c;第一句话通常是&#xff1a;我想提高英语&#xff0c;有什么资料推荐&#xff1f; 这要看你学英语的目的了。 我们学英语是为了什么? 理由可能很多&#xff0c;我就说个最俗的目的吧&#xff0c;为了发财。 想发财应向谁学习&…

代码随想录第31天|● 455.分发饼干 ● 376. 摆动序列 ● 53. 最大子序和

455.分发饼干 大尺寸的饼干既可以满足胃口大的孩子也可以满足胃口小的孩子&#xff0c;那么就应该优先满足胃口大的。 这里的局部最优就是大饼干喂给胃口大的&#xff0c;充分利用饼干尺寸喂饱一个&#xff0c;全局最优就是喂饱尽可能多的小孩。 可以尝试使用贪心策略&#xf…

[ 数据结构 ] 最小生成树(MST)--------普里姆算法、克鲁斯卡尔算法

0 修路问题 有胜利乡有 7 个村庄(A, B, C, D, E, F, G) &#xff0c;现在需要修路把 7 个村庄连通各个村庄的距离用边线表示(权) &#xff0c;比如 A – B 距离 5 公里问&#xff1a;如何修路保证各个村庄都能连通&#xff0c;并且总的修建公路总里程最短? 思路: 将 10 条边&a…

Java常用工具类方法(上)

1. Collections首先出场的是java.util包下的Collections类&#xff0c;该类主要用于操作集合或者返回集合&#xff0c;我个人非常喜欢用它。1.1 排序在工作中经常有对集合排序的需求。看看使用Collections工具是如何实现升序和降序的&#xff1a;List<Integer> list new…

揭秘链动2+1商业模式玩法

链动21模式主要是打造裂变团队的同时又能快速地将平台销售额提升起来&#xff0c;链动模式可以说颠覆传统的分销&#xff0c;算是一个创新更能吸引用户&#xff0c;稳住会员&#xff0c;拓展新客户的商业模式。 链动21模式有两个身份&#xff0c;分别是代理和老板 【代理商】…

Java高手速成 | 高质量代码编写最佳实践

程序员之间交流时&#xff0c;会经常使用非程序员无法理解的行话&#xff0c;或者使用令操不同编程语言的程序员理解起来比较模糊的行话。 但是&#xff0c;那些操相同编程语言的程序员理解起来不会产生什么问题。 这有时也取决于程序员所掌握知识的渊博程度。 一个新手或许不理…

以 Animated Drawings APP 为例,用 TorchServe 进行模型调优

内容导读 上节介绍了 TorchServe 模型部署调优的 5 个步骤&#xff0c;将模型部署到生产环境中。本节以 Animated Drawings APP 为例&#xff0c;实际演示 TorchServe 的模型优化效果。 本文首发自微信公众号&#xff1a;PyTorch 开发者社区 去年&#xff0c;Meta 凭借 Animate…

win系统重装系统后提示 BitLocker(磁盘加密)密钥查找及如何关闭

文章目录前言如何找到恢复秘钥&#xff0c;解锁磁盘1、打开链接&#xff1a;[https://support.microsoft.com/zh-cn/help/4026181/windows-10-find-my-bitlocker-recovery-key](https://support.microsoft.com/zh-cn/help/4026181/windows-10-find-my-bitlocker-recovery-key)2…

Nuxt3+ElementPlus构建打包部署手记

文章目录为何选Nuxt.js?工程package.json参考目录结构页面之间的关系几个主要命令动态组件获取后台数据SSR打包方式部署参考文档为何选Nuxt.js? 在前后端分离出现之前&#xff0c;传统的web页面都是服务端渲染的&#xff0c;如JSP、PHP、Python Django&#xff0c;还有各种模…

06【Filter】

文章目录06【Filter】一、过滤器简介1.1 Filter概述1.2 Filter的使用1.2.1 Filter快速体验1.2.2 XML配置Filter1.2.3 Filter的拦截规则1.3 Filter的生命周期1.3.1 Filter生命周期介绍1.3.2 Filter生命周期相关方法1.3.3 FilterConfig类1.4 Filter的拦截方式1.4.1 REQUEST1.4.2 …

Linux系统编程——管道

文章目录一、管道1.管道的特质2.管道的用法——pipe函数3.管道的读写行为4..管道的优劣二.实战练习&#xff1a;实现ls | wc -l 指令三、fifo实现非血缘关系进程间通信一、管道 1.管道的特质 实现原理: 内核借助环形队列机制&#xff0c;使用内核缓冲区实现。 特质: 1.伪文件…

接口测试 Mock 实战(二) | 结合 jq 完成批量化的手工 Mock

一、应用背景因为本章的内容是使用jq工具配合完成&#xff0c;因此在开始部分会先花一定的篇幅介绍jq机器使用&#xff0c;如果读者已经熟悉jq&#xff0c;可以直接跳过这部分。先来看应用场景&#xff0c;App 经常会有一些信息展示的列表页&#xff0c;比如商家的菜品、股票的…

真无线蓝牙耳机怎么选?分体式蓝牙耳机选购攻略及推荐

近年来&#xff0c;随着智能手机终端市场的崛起&#xff0c;无线蓝牙耳机的产销也随之呈持续增长的态势。真无线蓝牙耳机凭借其时尚、便捷性&#xff0c;迅速成为年轻人出门必备的数码单品之一。蓝牙耳机经过多年发展&#xff0c;其产品种类、品牌型号数不胜数。导致&#xff0…

springboot监听器的使用(ApplicationListener、SmartApplicationListener、@EventListener)

目录前言1. ApplicationListener1. 简单的全局监听2. 定时任务3. 监听自定义事件2. SmartApplicationListener1. 简单使用2. 方法介绍3. EventListener前言 监听器&#xff1a; 当某个事件触发的时候&#xff0c;就会执行的方法块。 springboot提供了两个接口来实现监听&…

Paddle进阶实战系列(一):保险文本视觉认知问答

保险文本视觉认知问答 1.项目介绍 1.1背景 随着人工智能技术的逐渐成熟&#xff0c;计算机视觉、语音、自然语言处理等技术在金融行业的应用从广度和深度上都在加速&#xff0c;这不仅降低了金融机构的运营和风险成本&#xff0c;而且有助于提升客户的满意度&#xff0c;比如…

Rhec第二次作业

两台机器&#xff1a;第一台机器作为客户端&#xff0c;第二台机器作为服务器&#xff0c;在第一台使用rhce用户免密登录第二台机器准备两台虚拟机并保证可以ping通网络&#xff0c;ip地址不一样第一台机器配置创建rhce用户在rhce用户上&#xff0c;创建密钥对并将公钥发送给第…

JDK源码(二)ConcurrentHashMap-JDK1.7

1.背景 并发编程中&#xff0c;ConcurrentHashMap是一个使用度非常高的数据结构。 优点: 线程安全相比于HashTable和Collections.synchronizedMap()效率高&#xff0c;使用了分段锁技术。 2.ConcurrentHashMap数据结构 Segment Segment继承了ReentrantLock&#xff0c;所以它…

Java设计模式-桥接模式Bridge

传统模式 案例 要求对不同手机类型的不同品牌实现操作编程(比如:开机、关机、上网&#xff0c;打电话等)&#xff0c;如图: 类图 问题 扩展性问题(类爆炸)&#xff0c;如果我们再增加手机的样式(旋转式)&#xff0c;就需要增加各个品牌手机的类&#xff0c;同样如果我们…