Linux进度条小程序

这篇具有很好参考价值的文章主要介绍了Linux进度条小程序。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Linux进度条小程序,Linux,原创,linux,小程序,运维

🪅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;
}

Linux进度条小程序,Linux,原创,linux,小程序,运维

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

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

♥1.2 换行

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

Linux进度条小程序,Linux,原创,linux,小程序,运维

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

Linux进度条小程序,Linux,原创,linux,小程序,运维

🪆2. 缓冲区现象

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

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

Linux进度条小程序,Linux,原创,linux,小程序,运维

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

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

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

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

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

Linux进度条小程序,Linux,原创,linux,小程序,运维

🧸3. 进度条实现

♟3.1 逻辑

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

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

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

♟3.2 进度条样式

Linux进度条小程序,Linux,原创,linux,小程序,运维

♟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~100
  	if(rate < 0 || rate > 100)  return;
    //进度为多少就设置多少个 如果一个一个增加,那么就会出现->->这种现象 因为进度可能每次加的都不是1
  	memset(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)来控制,进度多少,我们就显式多少,防止这种现象

    Linux进度条小程序,Linux,原创,linux,小程序,运维

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

    Linux进度条小程序,Linux,原创,linux,小程序,运维

那本次分享就到这里的,如果有帮助的话,希望铁子们点赞支持一下,我们下期再见,如果还有下期的话。文章来源地址https://www.toymoban.com/news/detail-536839.html

到了这里,关于Linux进度条小程序的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Linux】make/Makefile & 进度条小程序

    目录 一,认识 make/makefile 二,实例代码 1,依赖关系 2,原理 3,项目清理 4,测试讲解 三,Linux第一个小程序-进度条 game.h game.c test.c 程序详解   会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力 一个工程中的源文件不计数,其按类型、功能、模块分

    2024年02月05日
    浏览(19)
  • 【Linux】进度条小程序——深度解剖(细节满满)

    ​​​​​ ​ 前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门! 订阅专栏阅读: YY 的《Linux》系列 ❀❀❀❀❀ 【Linux】Linux环境搭建(新手指南,购买,登录)(

    2024年02月14日
    浏览(20)
  • 【Linux】进度条小程序の深度解剖(7)

    ​​​​​ ​ 前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门! 订阅专栏阅读: YY 的《Linux》系列 ❀❀❀❀❀ 【Linux】Linux环境搭建(新手指南,购买,登录)(

    2024年02月06日
    浏览(25)
  • 【Linux】进度条小程序的深度解剖(细节满满)

    ​​​​​ ​ 前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门! 订阅专栏阅读: YY 的《Linux》系列 ❀❀❀❀❀ 【Linux】Linux环境搭建(新手指南,购买,登录)(

    2024年02月16日
    浏览(19)
  • 【Linux】从0到1实现一个进度条小程序

    个人主页:🍝在肯德基吃麻辣烫 我的gitee:gitee仓库 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处 进度条实现: 本文讲解如何从0到1实现一个进度条小程序。 我们在写作文的时候,写到了一行的结尾,就得另起一行并到开头继续写。 其中,这个另起一行的动作

    2024年02月14日
    浏览(26)
  • [Linux]手把手教你制作进度条小程序

    C语言中字符分为两种: 可显字符 控制字符 其中可显字符就是字符a这类的字符,控制字符就是n这种控制字符。 对于我们制作进度条,我们只需要关注两个控制字符: r – 进行回车操作 n – 进行换行加回车操作 说明: n本身是换行字符,但是C语言本身将其解析成了换行加回

    2024年02月14日
    浏览(25)
  • 【闪击Linux系列P7】进度条小程序の深度解剖

    ​​​​​ ​ 前言 大家好吖,欢迎来到 YY 滴 Linux系列 ,热烈欢迎! 本章主要内容面向接触过Linux的老铁,主要内容含 欢迎订阅 YY 滴Linux专栏!更多干货持续更新!以下是传送门! 订阅专栏阅读: YY 的《Linux》系列 ❀❀❀❀❀ 【Linux】Linux环境搭建(新手指南,购买,登录)(

    2024年02月13日
    浏览(24)
  • 【Linux从入门到精通】C语言模拟实现进度条小程序

        在Linux下,我们安装软件时会经常看到进度条,来告知我们安装的进度。我们不妨自己模拟实现一个进度条,看看其中的细节。模拟实现进度条并不困难,但其中的细节我们又不可忽视。 本篇文章会对模拟实现进度条进行详解 。 文章目录 一、进度条整体模板 二、输出缓

    2024年02月03日
    浏览(22)
  • Linux实现进度条小程序(包含基础版本和模拟下载过程版本)

    usleep这个函数的参数是微秒数,作用是让程序休眠对应的微秒数 1秒=1000毫秒 1毫秒=1000微秒 1微妙=1000纳秒 等等等等 因此下面的代码中的 usleep(1000000)=1秒 1.缓冲区 1.缓冲区概念的引出 首先,先让大家看两份代码,分析一下为什么出现这种情况? 请注意:这个代码的运行情况是:先打印

    2024年02月05日
    浏览(25)
  • 手把手教你如何在Linux下写进度条小程序(附源码)

    录屏2023 进入ProgressBar这个目录之后,使用ls命令查看是否创建成功 编写makefile文件是为了,使用make命令构建我们的.c文件,生成可执行程序 把源码复制粘贴到我们对应的文件中 使用vim指令先打开头文件 按小写i,进入插入模式(Insert),直接拷贝上去 再按esc,直接输入:wq(

    2024年02月04日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包