Linux进度条小程序

news2024/9/20 16:39:07

在这里插入图片描述

文章目录

  • 🪅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");	//1
    sleep(1);	//休眠一秒钟	//2
    return 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~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)来控制,进度多少,我们就显式多少,防止这种现象

    6

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

    7

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

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

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

相关文章

Linux 安装elasticsearch,kibana,Logstash

1、Elasticsearch 安装 cd /usr/localwget \ https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.17.7-linux-x86_64.tar.gz \ https://artifacts.elastic.co/downloads/kibana/kibana-7.17.7-linux-x86_64.tar.gz \ https://artifacts.elastic.co/downlo…

BM77-最长的括号子串

题目 给出一个长度为 n 的&#xff0c;仅包含字符 ( 和 ) 的字符串&#xff0c;计算最长的格式正确的括号子串的长度。 例1: 对于字符串 "(()" 来说&#xff0c;最长的格式正确的子串是 "()" &#xff0c;长度为 2 .例2&#xff1a;对于字符串 ")()…

AI Chat 设计模式:5. 策略模式

本文是该系列的第五篇&#xff0c;采用问答式的方式展开&#xff0c;问题由我提出&#xff0c;答案由 Chat AI 作出&#xff0c;灰色背景的文字则主要是我的旁白。 问题列表 Q.1 我想学习一下策略模式A.1Q.2 你先给我简单讲解一下吧A.2Q.3 你举得这个电商平台例子不错&#xf…

青岛大学_王卓老师【数据结构与算法】Week04_09_线性表的应用2_学习笔记

本文是个人学习笔记&#xff0c;素材来自青岛大学王卓老师的教学视频。 一方面用于学习记录与分享&#xff0c;另一方面是想让更多的人看到这么好的《数据结构与算法》的学习视频。 如有侵权&#xff0c;请留言作删文处理。 课程视频链接&#xff1a; 数据结构与算法基础–…

使用 tail -f 实时观测服务器日志输出

在开发阶段, 有 console 端的输出, 总是可以方便实时地看到应用的日志. 可一旦应用部署到服务器上之后呢, 日志被输出到文件中, 在某些情景下需要不停地查看日志文件的输出以定位某些问题, 此时是否还能像开发那样实时查看日志呢? 答案是可以的! 这个命令就是 tail -f . tail…

vue2 element-ui 2.9.1版不支持抽屉el-drawer

一个老项目中想使用抽屉 el-drawer&#xff0c;死活没有反应。 查了下element-ui的版本是2.9.1 再看其他一个正常使用抽屉的项目的element-ui版本。 但是 2.14.1 的element-ui版本又存在菜单管理无法折叠菜单项的问题。 看来还是得抽空解决在2.14.1菜单无法折叠的问题了。

一文了解潜力黑马Infiblue:借力Web3,释放元宇宙价值

2013 年&#xff0c;JDN Dionisio 曾发表了一篇名为《3D Virtual Worlds and the Metaverse: Current Status and Future Possibilities》的论文&#xff0c;深入探讨与归纳了虚拟世界的几个发展阶段&#xff0c;可以简单的归纳为&#xff1a; 第一阶段&#xff1a;基于计算机文…

零代码量化投资:用ChatGPT获取新浪财经上的股票实时行情

现在很多免费的股票数据库&#xff0c;比如akshare&#xff0c;其实是从新浪财经或者东方财富网站上爬取下来的。如果能直接从新浪财经或者东方财富网站上爬取数据&#xff0c;可以获取更全面更即时的信息。 可以在ChatGPT中输入提示词如下&#xff1a; 写一段Python代码&…

探索stable-diffusion技术乐园:活学活用界面参数

开篇 嗨!欢迎踏入我们充满有趣和创新的stable-diffusion技术乐园,让我们一起走进stable-diffusion界面参数的世界,看看怎样如行家袋里取物般自在地活用这些参数! 看了这么多大V、大卡和群粉们使用的英文,提起来有点沉,别急,我会尽量使用轻松的语气带你一起探索这些小秘…

MySQL视图、索引、导入导出、执行计划

目录 一、前言 1.导读 2.学习的好处 二、视图 1.什么是视图 2.视图与数据表的区别 3.使用视图的优点 4.视图的语法 1.创建视图&#xff08;CREATE VIEW&#xff09; 2.查询视图数据 3.更新视图数据 4.修改视图定义(ALTER VIEW) 5.删除视图&#xff08;DROP VIEW&a…

VSCode中打开NodeJS项目自动切换对应版本的配置

这几年搞了不少静态站点&#xff0c;有的是Hexo的&#xff0c;有的是VuePress的。由于不同的主题对于NodeJS的版本要求不同&#xff0c;所以本机上不少NodeJS的版本。 关于如何管理多个NodeJS版本&#xff0c;很早之前就写过用nvm来管理的相关文章&#xff0c;这里就不赘述了&a…

第四范式携「式说」亮相世界人工智能大会 大模型落地进入加速时刻

7月6日-8日&#xff0c;以“智联世界 生成未来”为主题的2023世界人工智能大会&#xff08;WAIC&#xff09;在上海召开&#xff0c;本届大会聚焦通用人工智能发展。第四范式携「式说」大模型亮相现场&#xff0c;更有第四范式「大模型之城」首秀&#xff0c;汇聚了大模型在金融…

Elasticsearch【全文检索、倒排索引、应用场景、对比Solr、数据结构】(一)-全面详解(学习总结---从入门到深化)

目录 Elasticsearch介绍_全文检索 Elasticsearch介绍_倒排索引 Elasticsearch介绍_Elasticsearch的出现 Elasticsearch介绍_Elasticsearch应用场景 Elasticsearch介绍_Elasticsearch对比Solr Elasticsearch介绍_Elasticsearch数据结构 Elasticsearch介绍_全文检索 Elasti…

休闲时光:最近上映的电影与爬虫世界,带您彻底放松!

大家好&#xff0c;我是安果&#xff01; 周末是与亲朋好友相聚的好时机&#xff0c;可以选择一部大家都喜欢的电影&#xff0c;彻底放松&#xff0c;共同度过一个愉快而难忘的周末 本篇文章将介绍如何使用 Scrapy 爬取最新上映的电影 目标对象&#xff1a; aHR0cHM6Ly93d3cubW…

深入浅出讲解Python中的可变类型与不可变类型,以及赋值,浅拷贝与深拷贝的区别

文章目录 1、不可变数据类型2、可变数据类型3、赋值&#xff0c;浅拷贝与深拷贝3.1 赋值操作符 3.2 浅拷贝copy()3.3 深拷贝copy() 小结 在Python中&#xff0c;数据类型主要分为可变数据类型和不可变数据类型。主要的区别在于可变数据类型的值可以改变&#xff0c;而不可变数据…

【网络系统集成】路由器实验

1.实验名称:路由器RIP协议配置 2.实验目的 在PacketTracer中进行模拟实验,配置RIP协议,验证RIP协议更新时间及路由状态变化,加深对路由器RIP协议相关知识的理解与掌握。 3.实验内容 (1)拓扑结构图 (2)ip地址分配与端口分配

Mybatis基础总结1

Mybatis快速入门 一.Mybatis快速入门1.1 框架介绍1.2 ORM介绍1.3 原始jdbc操作&#xff08;查询数据&#xff09;1.4原始jdbc操作&#xff08;插入数据&#xff09;1.5 原始jdbc操作的分析1.6 什么是Mybatis1.7 Mybatis的快速入门1.7.1 环境搭建1.7.2编写测试代码 1.8 知识小结…

Linux进程调度

转自&#xff1a;深入理解Linux进程调度(0.4)_进程调度 城_城中之城的博客-CSDN博客 一、进程调度概览 进程调度是操作系统最重要的内容之一&#xff0c;也是学习操作系统的重点和难点。关于进程本身的实现和管理请参看《深入理解Linux进程管理》。关于进程调度&#xff0c;我…

阿里云ECS服务器架构X86计算_ARM_GPU/FPGA_裸金属_超级计算集群

阿里云服务器架构有什么区别&#xff1f;X86计算、ARM计算、GPU/FPGA/ASIC、弹性裸金属服务器、超级计算集群有什么区别&#xff1f;阿里云服务器网分享云服务器ECS架构详细说明&#xff1a; 目录 阿里云服务器ECS架构说明 X86计算 ARM计算 GPU/FPGA/ASIC 弹性裸金属服务…

mysql单表查询,排序,分组查询,运算符,select,order by,group by

CREATE TABLE emp (empno int(4) NOT NULL, --员工编号ename varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,--员工名字job varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL,--员工工作mgr int(4) NULL DEFAULT NU…