Linux进度条小程序

在这里插入图片描述

文章目录

  • 🪅1. 回车换行
    • ♥1.1 回车
    • ♥1.2 换行
  • 🪆2. 缓冲区现象
  • 🧸3. 进度条实现
    • ♟3.1 逻辑
    • ♟3.2 进度条样式
    • ♟3.3 代码实现
  • 🃏4. 场景使用

🪅1. 回车换行

在学习C语言的时候,我们输出的时候,通常会使用\n,进行换行输出。其实这的所谓的换行,包含了2个操作:回车、换行

♥1.1 回车

回车的本意是将光标回车到当前行的最前面,在C语言中\r表示回车。

#include<Windows.h>
int main()
{int cnt = 15;while (cnt--){printf("%-2d\r", cnt);//回车Sleep(100);}return 0;
}

1

这就是回车的现象,这里按理说最后应该会输出到0停止,然后将0显式到终端。

程序结束之后会自动回车换行,所以这里的回车换行就覆盖了0。

♥1.2 换行

换行的意思就是换一行,将光标换到当前行的下一行,C语言中将换行符\n其实是合并成了回车换行

image-20230707200052930

#include<Windows.h>
int main()
{int cnt = 15;while (cnt--){printf("%-2d\n", cnt);//回车换行Sleep(100);}return 0;
}

2

🪆2. 缓冲区现象

#include<stdio.h>
#include<unistd.h>	//sleep所需头文件
int main()
{printf("hello linux");	//1sleep(1);	//休眠一秒钟	//2return 0;
}

在Linux中,执行这段代码,我们观察到并不是直接输出hello linux,而是先休眠2秒,在输出hello linux

3

这并不是因为先执行了sleep(1),而是hello linux被保存在了缓冲区,,这个缓冲区是有C语言提供的。

由于没有\n换行刷新,所以当这段程序结束时,缓冲区的数据才会被刷出。如果想要将这段数据强制刷新出来,需要了解三个东西:

  1. 标准输入
  2. 标准输出
  3. 标准错误

C程序默认会打开三个输入输出流,在Linux下,一切皆文件,显示器也属于文件,显示器所对应的文件类型是stdout

fflush函数是标准C库中的一个函数,用于刷新流的输出缓冲区。我们可以调用这个函数强制刷新缓冲区。

4

🧸3. 进度条实现

♟3.1 逻辑

  1. 确定进度条的总长度和当前角度的比例
  2. 根据比例计算出当前进度条的填充长度
  3. 使用特定的字符表示填充部分
  4. 进度条旁边显示百分比完成的信息

进度条的实现,我们也是分三个文件:

  • 头文件:proceeBar.h
  • 逻辑实现:processBar.c
  • 测试文件:main.c

♟3.2 进度条样式

5

♟3.3 代码实现

processBar.h

#pragma once
#include<stdio.h>
#include<unistd.h>
#include<string.h>
//0~100 有101个字符,\0也需要一个空间 -->102
#define NUM 102//填充部分的字符(根据自己喜欢选择)
#define STYLE '-'//循环次数
#define TOP 100//右侧字符
#define RIGHT '>'//进度条函数声明
extern void processbar(int rate,int cur);//初始化
extern void initbar(); 

processBar.c

#include"processBar.h"
const char* lable = "|/-\\";
char bar[NUM];void initbar()                                                            
{memset(bar,'\0',sizeof(bar));
}void processbar(int rate,int cur)
{int len = strlen(lable);//进度为0~100if(rate < 0 || rate > 100)  return;//进度为多少就设置多少个 如果一个一个增加,那么就会出现->->这种现象 因为进度可能每次加的都不是1memset(bar, STYLE, rate); if(rate<100){//右侧箭头bar[rate++] = RIGHT;printf("[%-100s][%d%%][%c][已下载:%dMB]\r", bar,rate,lable[rate%len],cur);}else{printf("[%-100s][%d%%][%c][已下载:%dMB]\r", bar,rate,lable[rate%len],cur);//bar为全局函数,每次调用完之后初始化initbar();}fflush(stdout);
}

🃏4. 场景使用

进度条一般在下载场景中使用,我们可以用main.c来进行模拟下载

#include"processBar.h"//回调函数
typedef void (*callBack_t)(int,int);//模拟下载
void downLoad(callBack_t cb)
{//下载目标int total = 0;printf("要下载多少MB:");scanf("%d",&total);//当前进度int cur = 0;printf("当前进度多少:");scanf("%d",&cur);int flag = 1;while(cur<=total){//下载时间usleep(50000);int rate = cur*100/total;cb(rate,cur);//假设每次下载多少cur += 10;//防止下载不足if(cur>total && flag){cur = total;flag = 0;}}printf("\n");
}int main()
{//假设进行三次下载printf("第一次下载:\n");downLoad(processbar);printf("第二次下载:\n");downLoad(processbar);printf("第三次下载:\n");downLoad(processbar);return 0;
}

这个进度条的显式可以根据自己喜爱的风格再进一步完善,但主体思路就是这样

Tips:

这里一定要注意几个点

  1. rate来表示下载百分比,这里可能不是每次增加1,所以直接memset(bar, STYLE, rate)来控制,进度多少,我们就显式多少,防止这种现象

    6

  2. 在模拟下载的时候,要对下载进度进行判断,防止下载不足

    7

那本次分享就到这里的,如果有帮助的话,希望铁子们点赞支持一下,我们下期再见,如果还有下期的话。

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

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

相关文章

【Redis】高可用之二:哨兵(sentinel)

本文是Redis系列第5篇&#xff0c;前4篇欢迎移步 【Redis】不卡壳的 Redis 学习之路&#xff1a;从十大数据类型开始入手_AQin1012的博客-CSDN博客关于Redis的数据类型&#xff0c;各个文章总有些小不同&#xff0c;我们这里讨论的是Redis 7.0&#xff0c;为确保准确&#xff…

python OA流程图xml文件画图 graphviz的使用

下面的公文发文的流程图&#xff0c;虽然流程环节有坐标信息&#xff0c;但graphviz设置pos参数效果也不是太好 问题在于如何为流程环节设置绝对坐标 D:\Study\myproject\Python_auto_office\flow_report\utils\draw_image.py 通过xml流程文件绘制流程图 import graphviz …

使用OpenCV在图像上绘制质心

这段代码中已经实现了在图像上绘制质心的功能。质心,也称为重心,是物体质量分布的几何中心,可以通过物体质量和位置的加权平均来求得。 在这个程序中,图像的质心(重心)是通过计算像素强度(可以被看作是“质量”)的加权平均位置得到的。图像上每一个像素都有一个位置(…

谈谈VPN是什么、类型、使用场景、工作原理

作者&#xff1a;Insist-- 个人主页&#xff1a;insist--个人主页 作者会持续更新网络知识和python基础知识&#xff0c;期待你的关注 前言 本文将讲解VPN是什么、以及它的类型、使用场景、工作原理。 目录 一、VPN是什么&#xff1f; 二、VPN的类型 1、站点对站点VPN 2、…

怎么把word转换成只有一页的长页PDF?

来百度APP畅享高清图片 要将Word文档打印成一长页的PDF格式&#xff0c;我们得先知道word转PDF的工作原理。word转pdf其实就是将word打印出来&#xff0c;就是跟你用物理打印机打印的原理是差不多的&#xff0c;所不同的是&#xff0c;PDF虚拟打印的原理是利用虚拟打印机驱动程…

对Vue组件化开发思想的一些理解

目录 组件的分类 为什么需要组件化开发 如何设计组件 组件间通信 组件系统是 Vue的一个重要概念&#xff0c;让我们可以用独立可复用的小组件来构建大型应用。几乎任意类型的应用的界面都可以抽象为一个组件树&#xff1a; 写一个 Vue 项目&#xff0c;其实就是在写一个个的…

达梦sql执行计划、HINT、索引简单应用

目录 收集统计信息. 3 1. 通过DBMS_STATS包中的方法. 3 2、删除指定表的统计信息. 3 执行计划. 3 常用执行计划操作符. 4 统计指定sql执行号的所有操作符的执行时间. 5 HINT 5 并行操作&#xff1a;. 6 查询计划重用、结果集重用. 7 示例. 8 1、收集统计信息&#x…

(中等)LeetCode 剑指OfferII 074. 合并区间

排序&#xff1a; 用数组merged存储最终的答案 首先&#xff0c;将列表中的区间按照左端点升序排序&#xff0c;将第一个区间加入merged数组中&#xff0c;并按顺序依次考虑之后的每个区间&#xff1a; 如果当前区间的左端点在数组merged中最后一个区间的右端点之后&#xf…

unity计时,1秒执行一次

1.核心代码示例 2.代码 using System.Collections; using System.Collections.Generic; using UnityEngine;public class AddRandomChilden : MonoBehaviour {// Debug.Log("开始进入update");float i 0;// Start is called before the first frame updatevoid Sta…

【问题分析解决】git添加.gitignore后不生效问题

一&#xff0c;问题现象 在已经提交过的git管理的项目中&#xff0c;新增加一个.gitignore文件&#xff0c;或者修改.gitignore文件之后&#xff0c;新增的内容不生效。 二&#xff0c;问题原因 因为我们误解了.gitignore文件的用途&#xff0c;该文件只能作用于Untracked F…

DSP(css)开发代码掉电保存下载到flash

DSP&#xff08;css&#xff09;开发代码掉电保存下载到flash 文章目录 DSP&#xff08;css&#xff09;开发代码掉电保存下载到flash source目录下删除28335_RAM_lnk.cmd&#xff0c;添加F28335.cmd和DSP2833x_MemCopy.c文件 main函数添加下列内容&#xff08;一般添加在 Ini…

10.1.5 查询指令是否为 Bash shell 的内置命令: type

通过 type 这个指令我们可以知道每个指令是否为 bash 的内置指令。 此外&#xff0c;由于利用 type 搜寻后面的名称时&#xff0c;如果后面接的名称并不能以可执行文件的状态被找到&#xff0c; 那么该名称是不会被显示出来的。也就是说&#xff0c; type 主要在找出“可执行文…