[linux小程序]进度条


📙 作者简介 :RO-BERRY
📗 学习方向:致力于C、C++、数据结构、TCP/IP、数据库等等一系列知识
📒 日后方向 : 偏向于CPP开发以及大数据方向,欢迎各位关注,谢谢各位的支持


请添加图片描述


目录

  • 1.缓冲区
  • 2)\n 和 \r
  • 3.进度条
    • ProgressBar.c
    • ProgressBar.h
    • Makefile
    • main.c


1.缓冲区

  • 第一种情况
    在这里插入图片描述
    执行结果如下:
    请添加图片描述
    可以看到程序先执行printf再执行sleep

  • 第二种情况
    在这里插入图片描述
    执行结果如下:
    请添加图片描述

在这里为什么程序先执行sleep在执行printf呢?
实际上也并没有先执行sleep再执行printf,C语言执行代码是顺序结构自上往下
在这里运行的时候,程序运行sleep的时候printf早就运行完毕了
我们程序休眠之前没有看到字符串,那么我们输出的字符串一定是被保护起来了,在退出的时候才刷新出来
那么在sleep期间在哪里保存呢?
下面我们引出一个概念- - -缓冲区。

其实上面的现象中,在程序执行 printf 后,printf 打印的内容被存放到缓冲区中,在 C/C++ 中,会针对标准输出,给我们提供默认的缓冲区,而在缓冲区没有被刷新之前,我们的内容就不会被输出。
而 \n 就是一种刷新的策略 - - - 行刷新。所以我们加了 \n 后缓冲区被刷新,随即便打印出内容。
而我们没有使用 \n 的时候缓冲区并没有被刷新,但是我们可以使用 fflush(stdout) 强制刷新缓冲区,从而打印出内容,例如:
在这里插入图片描述
执行结果如下:
请添加图片描述
我们可以看到,缓冲区的内容被强制刷新出来了。

2)\n 和 \r

我们首先编写一个简单的倒计数程序,例如:
在这里插入图片描述
观察结果:
请添加图片描述
但是这并不是我们想要的倒计时,我们是期望在同一行中显示出来,所以我们不应该用 \n,其实 \n 就是我们所说的回车,就是使光标换行并回到那一行的最初位置;这时候我们就应该使用 \r,\r 就仅仅让光标回到当前行的最初位置,我们对上面的代码修改,如下:
在这里插入图片描述
执行结果如下:
在这里插入图片描述
从上面的结果可看出,我们的倒计时虽然在同一行了,但是输出的格式还是有问题,因为默认 %d 是按照一个字符的形式打印的,我们是要按照两个字符打印,所以我们仅需将%d修改为%2d即可,如下:
在这里插入图片描述
结果如下:
在这里插入图片描述
这时候就基本完成我们的倒计时了,但是倒计时到个位数的时候,前面空了一个字符,不太美观,这是因为 %2d 是默认右对齐,我们在前面加上负号,就是左对齐了,所以我们继续修改:
在这里插入图片描述
结果如下:
在这里插入图片描述
到此我们的倒计数就完成了。

3.进度条

ProgressBar.c

#include "ProgressBar.h"
const char *str = "|/-\\"; // 加载光标void ProgressBar_v1()
{// 当前进度int rate = 0;char bar[SIZE];memset(bar, '\0', sizeof(bar));// 加载光标的数组长度int num = strlen(str);// 当进度没有加载满while(rate <= MAX_RATE){printf("[%-100s][%d%%][%c]\r", bar, rate, str[rate % num]);fflush(stdout);usleep(STIME);                    bar[rate++] = STYLE;              }printf("\n");                         
}

ProgressBar.h

#include <stdio.h>
#include <unistd.h>
#include <string.h>void ProgressBar_v1();
#define SIZE 101      //数组大小
#define MAX_RATE 100  //加载进度最大值
#define STYLE '#'     //加载符号
#define STIME 1000*40 //时间

Makefile

ProgressBar:main.c ProgressBar.cgcc -o $@ $^
.PHONY:clean
clean:rm -f ProgressBar     

main.c

#include "ProgressBar.h"int main()
{ProgressBar_v1();return 0;
}

我们在使用延时函数的时候使用了 usleep 函数,它与 sleep 相比就是,sleep 中以 s 为单位;usleep 中以 us 为单位。
运行成果:
在这里插入图片描述

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

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

相关文章

LeetCode.589. N 叉树的前序遍历

题目 589. N 叉树的前序遍历 分析 我们之前有做过LeetCode的 144. 二叉树的前序遍历&#xff0c;其实对于 N 插树来说和二叉树的思路是一模一样的。 二叉树的前序遍历是【根 左 右】 N叉树的前序遍历顺序是【根 孩子】&#xff0c;你可以把二叉树的【根 左 右】想象成【根 孩…

领域驱动设计(Domain Driven Design)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、场景和要求二、领域模型关键词1.领域2.子域3.通用语言4.限界上下文5.领域模型6.实体和值对象7.聚合根8.领域服务9.领域事件 总结 前言 Domain Driven Desi…

Docker安装RocketMQ

文章目录 前言一、rocketMQ安装教程二、rocketmq-console可视化界面 前言 本章节将介绍如何在docker环境下安装rocketmq以及rocketmq-console可视化界面 一、rocketMQ安装教程 在安装之前请保证您的服务器已经安装好docker环境并且安装好JDK &#xff08;1&#xff09;拉取r…

什么软件可以保护公司办公终端 \ 电脑的文件数据、资料不被外泄?

天锐绿盾终端安全管理系统&#xff1a;这是一款综合性的安全软件&#xff0c;提供了文件加密、图纸加密、文档加密、源代码防泄密等多种智能透明加密功能&#xff0c;操作简单易用。 PC端&#xff1a;https://isite.baidu.com/site/wjz012xr/2eae091d-1b97-4276-90bc-6757c5dfe…

Mysql事务原理与优化

概述 我们的数据库一般都会并发执行多个事务&#xff0c;多个事务可能会并发的对相同的一批数据进行增删改查操作&#xff0c;可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题&#xff0c;为了解决多事务并发问题&…

C语言—指针(3)

嘿嘿嘿嘿&#xff0c;你看我像指针吗? 不会写&#xff0c;等我啥时候会写了再说吧&#xff0c;真的累了&#xff0c;倦了 1.面试题 1&#xff09;定义整形变量i&#xff1b; 2&#xff09;p为指向整形变量的指针变量&#xff1b; 3&#xff09;定…

Atcoder ABC340 C - Divide and Divide

Divide and Divide&#xff08;分而治之&#xff09; 时间限制&#xff1a;2s 内存限制&#xff1a;1024MB 【原题地址】 所有图片源自Atcoder&#xff0c;题目译文源自脚本Atcoder Better! 点击此处跳转至原题 【问题描述】 【输入格式】 【输出格式】 【样例1】 【样例…

微信小程序-绑定数据并在后台获取它

如图 遍历列表的过程中需要绑定数据&#xff0c;点击时候需要绑定数据 这里是源代码 <block wx:for"{{productList}}" wx:key"productId"><view class"product-item" bindtap"handleProductClick" data-product-id"{{i…

Uniapp-开发小程序

文章目录 前言一、npm run xxx —— cross-env: Permission denied解决方法&#xff08;亲测有效&#xff09;其他解决方法&#xff1a; 二、macOS 微信开发者工具选择uniapp 用 vscode 开发 总结 前言 macOS下 uniapp 开发小程序。 一、npm run xxx —— cross-env: Permissi…

ACE的MPC编译

如下需要下载已经生成好的工程&#xff0c;链接如下: Releases DOCGroup/ACE_TAO GitHub 步骤1 下载ACE:ACE 下载MPC:MPC 下载perl并安装&#xff1a;perl 注意&#xff1a;perl安装中勾选将perl路径添加到path环境变更中&#xff0c;安装完后重启 解压ACE后路径如下:…

突破百度地图Web API的配额限制,实现接口调用自由!

声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 引言 好久没用百度地图开放平台,最近发现平台调整了接口调用的策略,增加了实名认证,…

JAVA高并发——人手一支笔:ThreadLocal

文章目录 1、ThreadLocal的简单使用2、ThreadLocal的实现原理3、对性能有何帮助4、线程私有的随机数发生器ThreadLocalRandom4.1、反射的高效替代方案4.2、随机数种子4.3、探针Probe的作用 除了控制资源的访问&#xff0c;我们还可以通过增加资源来保证所有对象的线程安全。比如…