秒懂Linux之编写小程序——进度条

embedded/2024/10/18 8:33:05/

fe594ea5bf754ddbb223a54d8fb1e7bc.gif

目录

 

一.前文摘要

二.进度条编写

三全部代码(非Linux环境下测试)


一.前文摘要

在开始编写之前我们先来学习一些后面会用到的知识点~

测试结果发现,Sleep无作用,编译完会立刻打印~

再来看另一个测试~我们同样没有换行,而是用回车'\r'取代~这时候屏幕就会一直卡着不动,这是因为打印的结果都存储在缓冲区里,之前是通过‘\n'成功把它们刷新出来,不过这样sleep就没有效果了~

在确保延时又能刷新数据我们可以用fflush(stdout),它负责刷新缓冲区,同时也不会影响的sleep~

二.进度条编写

先搭建好3个文件~

然后再搭建makefile文件

准备工作完成,测试也没问题,现在就来开始编写代码啦~

编写代码的时候注意几点:\r回车回到起始点、fflush刷新缓冲区、插入字符

接下来我们来实现旋转光标以及百分比

这样我们就构建好进度条啦~,不过这种进度条只是我们人为的,我们得实现出依赖于其他应用而衍生出来的进度~

下面我们通过模拟下载文件来实现新版本进度条~

我们先是编写了一个下载文件的函数,通过设置文件大小与下载速度来获取每一时刻的对应比率。

然后我们再通过传输比率来让进度条成功显示~

//小细节,这里我们定义了一个函数指针类型的回调函数(不写也无伤大雅)

三全部代码(非Linux环境下测试)

//main.c
#include <stdio.h>
#include <Windows.h>
#include"processbar.h"
#include<stdlib.h>
#include<time.h>#define FILESIZE 1024*1024*1024//目标文件大小为1G
void downfile()
{srand(time(NULL)^1023);//随机数条件int total = FILESIZE;//表示还剩余多少未被下载 while (total){Sleep(0.1);//int speed = rand() % (1024);//我们把随机生成的下载速度控制在1M以内 total -= speed;//实时更新总量 if (total < 0){total = 0;//因为无法控制速度,避免溢出,及时重置}//显示当前进度int download = FILESIZE - total;double rate = (download * 1.0 / (FILESIZE) * 100.0);//以百分比小数进行,确保转化processplus(rate);// cb(rate);// printf("download:%f\n",rate);//只要rate一出现就让进度条显示}
}int main()
{downfile(); return 0;
}
//processbar.h
#pragma once
#include <stdio.h>
#define NUM 108
#define A '='
//typedef void (*callback_t)(double);//回调函数
//plan1 自主更新的进度条 
//void process();//plan2 实时更新的进度条
void processplus(double rate);

//processbar.c
#define _CRT_SECURE_NO_WARNINGS 1
#include "processbar.h"
#include <string.h>
#include <windows.h>const char* x = "|/-\\";//旋转光标 
char buff[NUM]={0};
//plan2 实时更新的进度条
void processplus(double rate)
{int cnt = (int)rate;int n = strlen(x);//方便取模规定范围// if(rate<=1.0) buff[0]=A;printf("[%-100s][%.1f][%c]\r", buff, rate, x[cnt % n]); fflush(stdout);buff[(int)rate] = A; if (rate >= 100.0){printf("\n");}cnt++;//旋转光标变化
}


http://www.ppmy.cn/embedded/88962.html

相关文章

【gpt预测与推理区别】

推理时不能并行计算所有位置的主要原因在于生成文本的过程是自回归的&#xff0c;也就是说&#xff0c;生成每个新的单词都依赖于之前已经生成的单词。这个过程需要一步一步地进行&#xff0c;因为每一步的输出会成为下一步的输入。下面是对这个过程的详细解释&#xff1a; 自…

面试经典 222. 完全二叉树的节点个数

二叉树我最近刷的特别多&#xff0c;差不多快刷完了&#xff0c;但是有一种题型差点给我忽略了&#xff0c;那就是完全二叉树&#xff0c;这也是一个很重要的题型&#xff0c;今天刚好有一道题目可以来复习一下完全二叉树的特性 题目链接如下&#xff1a;https://leetcode.cn/…

笑谈“八股文”,人生不成文

一、“八股文”在实际工作中是助力、阻力还是空谈&#xff1f; 作为现在各类大中小企业面试程序员时的必问内容&#xff0c;“八股文”似乎是很重要的存在。但“八股文”是否能在实际工作中发挥它“敲门砖”应有的作用呢&#xff1f;有IT人士不禁发出疑问&#xff1a;程序员面试…

Oracle(40)什么是异常处理(Exception Handling)?

异常处理&#xff08;Exception Handling&#xff09;是在程序运行过程中处理意外情况的机制。这些意外情况可能是运行时错误、逻辑错误或其他不可预见的问题。通过异常处理&#xff0c;程序可以捕获并处理这些错误&#xff0c;从而防止程序崩溃&#xff0c;并提供有意义的错误…

STL-list类

list实际上是数据结构中的带头双向循环链表 由于链表的存储方式并不是连续的内存空间&#xff0c;因此链表list中的迭代器只支持前移()和后移(--)&#xff0c;属于双向迭代器。 一、常见接口 官方文档&#xff1a;list - C Reference (cplusplus.com) 1.1 构造函数 函数名…

springboot集成canal

目录 一、打开mysql的binlog1.1 打开 MySQL 配置文件 my.cnf&#xff08;通常位于 /etc/mysql/my.cnf 或 /etc/my.cnf&#xff09;并添加或修改以下设置&#xff1a;1.2 重启mysql服务1.3 验证是否生效 二、 部署canal 服务端&#xff08;docker&#xff09;2.1 下载启动脚本(可…

创建型设计模式:单例、原型、建造者

链接&#xff1a;创建型设计模式&#xff1a;单例、原型、建造者 (qq.com) 工厂设计模式&#xff1a;简单工厂、工厂方法、抽象工厂 (qq.com) 六种创建型设计模式代码 (qq.com)

RK3568笔记五十:SPI通信-回环测试

若该文为原创文章&#xff0c;转载请注明原文出处。 一、SPI引脚关系 其中SPI1的引脚关系如下表所示 SPI 引脚 功能 MOSI GPIO3_C1 主设备输出/从设备输入 MISO GPIO3_C2 主设备输入/从设备输出 CLOCK CPIO3_C3 时钟信号线 CS0 GPIO3_A1 片选信号线0 CS1 NC …