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

一.前文摘要

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

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

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

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

二.进度条编写

先搭建好3个文件~

然后再搭建makefile文件


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

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

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

这样我们就构建好进度条啦~,不过这种进度条只是我们人为的,我们得实现出依赖于其他应用而衍生出来的进度~
下面我们通过模拟下载文件来实现新版本进度条~

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

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

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

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

cpp 复制代码
//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;
}
cpp 复制代码
//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);
cpp 复制代码
//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++;//旋转光标变化
}
相关推荐
Zhang~Ling36 分钟前
从 fopen 到 struct file:从零开始拆解 Linux 文件 I/O
linux·运维·服务器
DeeplyMind41 分钟前
Linux 深入 per-VMA lock:Linux 缺页路径如何摆脱 mmap_lock
linux·per-vma lock
爱写代码的森1 小时前
蒙三方库 | harmony-utils之FileUtil文件重命名与属性查询详解
linux·运维·服务器·华为·harmonyos·鸿蒙·huawei
中微极客1 小时前
2026主流AI Agent框架技术选型与性能对比
运维·网络·人工智能
XMAIPC_Robot2 小时前
软硬协同实时控制|RK3588业务调度+FPGA硬件时序,ethercat实现半导体设备微秒级响应(125us)
linux·arm开发·人工智能·fpga开发
AOwhisky2 小时前
Python 学习笔记(第十五期)——运维自动化(下·后篇):堡垒机实战——paramiko高阶篇
运维·python·学习·云原生·自动化·运维开发
重生的黑客2 小时前
Linux 进程优先级、切换与调度:从孤儿进程到 O(1) 调度模型
linux·运维·服务器·进程优先级·nice
Urbano3 小时前
夹克与商务单西口袋工序自动化技改研究报告
运维·自动化
云迈科技-软件定制开发3 小时前
2026年湖南长沙软件定制开发公司怎么选?本地企业做APP、小程序、管理系统的合作参考
小程序
骑上单车去旅行4 小时前
MD5校验对比脚本
linux·服务器·windows