news 2026/4/29 23:47:38

命令行进度条完全指南:倒计时、缓冲区刷新与动态下载

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
命令行进度条完全指南:倒计时、缓冲区刷新与动态下载

进度条—命令行版本

前置知识

1.回车换行

  • \r回车,将光标移动到当前行的开头。
  • \n换行,将光标移动到下一行的相同位置(通常是下一行开头)。

在终端中,单独使用\r可以实现在同一行覆盖输出,常用于进度条或倒计时。

2.缓冲区问题

在这个程序中,如果不带\n,会发现,先休眠3s,再输出hello bit ,但我们知道程序都是从上到下执行的,那在这3s,printf去哪里了呢?答案是缓冲区。显示器都是按行刷新的,不带\n无法刷新,最后程序结束。会自动刷新缓冲区,从而输出结果。

在Linux中,一切皆文件。

在 Linux 中,一切皆文件:

  • stdin→ 键盘
  • stdout→ 显示器
  • stderr→ 显示器(错误输出)

那怎么直接刷新输出结果呢?

用fflush

3.理解显示

关键点:显示器只认字符!任何图形、进度条等最终都要转化为字符序列输出。

4.简单倒计时程序

1#include<stdio.h>2#include<unistd.h>3intmain()4{5intn=10;6while(n>=0)7{8printf("%-2d\r",n);//\r是为了回车,让光标回到其实位置。-是向左对其。9fflush(stdout);10sleep(1);11n--;12}1314return0;15}

该程序目的是实现原地倒计时,效果如下

进度条

版本一:基础进度条

1.创建相关目录,及其文件

创建processbar目录,创建.h .c文件 还有main.c文件 以及makefile

Makefile内容

1 SRC=$(wildcard *.c) 2 OBJ=$(SRC:.c=.o) 3 BIN=processbar 4 5 $(BIN):$(OBJ) 6 gcc -o $@ $^ 7 %.o:%.c 8 gcc -c $< 9 .PHONY: 10 clean: 11 rm -f $(OBJ) $(BIN)
2.process.c
1#include"process.h"2#include<unistd.h>3#include<string.h>4#define NUM1015#define STYLE'='6voidprocess_v1()7{8charbuffer[NUM];9memset(buffer,0,sizeof(buffer));10constchar*lable="|/-\\";11intlen=strlen(lable);12intcnt=0;13while(cnt<=100)14{15printf("[%s][%%%d][%c]\r",buffer,cnt,lable[cnt%len]);16fflush(stdout);17cnt[buffer]=STYLE;18cnt++;19usleep(50000);20}21printf("\n");22}23
3.process.h
1#pragma once23#include<stdio.h>45voidprocess_v1();
4.main.c
1#include"process.h"2intmain()3{4process_v1();5return0;6}
演示效果

这个版本只用于演示进度条的基本原理,在实际开发中无法与下载、拷贝等任务结合使用。请看下一版本。

版本二:结合下载场景的动态进度条

这个版本将进度条与一个模拟的下载任务结合,每次下载一点数据就刷新一次进度条。

main.c
1#include"process.h"2#include<stdio.h>34doubletotal=1024.0;5doublespeed=1.0;67voidDownLoad()8{9doublecurrent=0;10while(current<=total)11{12FlushProcess(total,current);13//下载代码14usleep(10000);//充当下载数据15current+=speed;16}17printf("\ndownload %.21fMB Done\n",total);18}1920intmain()21{22DownLoad();23// process_v1();24return0;25}
process.c
1#include"process.h"2#include<unistd.h>3#include<string.h>4#define NUM1015#define STYLE'='6voidFlushProcess(doubletotal,doublecurrent)7{89charbuffer[NUM];10memset(buffer,0,sizeof(buffer));11constchar*lable="|/-\\";12intlen=strlen(lable);1314staticintcnt=0;15//不需要自己循环,填充#16intnum=(int)(current*100/total);17for(inti=0;i<num;i++)18{19buffer[i]=STYLE;20}21doublerate=current/total;22cnt%=len;23printf("[%-100s][%1.f%%][%c]\r",buffer,rate*100,lable[cnt]);24cnt++;25fflush(stdout);26}27voidprocess_v1()28{29charbuffer[NUM];30memset(buffer,0,sizeof(buffer));31constchar*lable="|/-\\";32intlen=strlen(lable);33intcnt=0;34while(cnt<=100)35{36printf("[%s][%%%d][%c]\r",buffer,cnt,lable[cnt%len]);37fflush(stdout);38cnt[buffer]=STYLE;39cnt++;40usleep(50000);41}42printf("\n");43}44
process.h
1#pragma once23#include<stdio.h>45voidFlushProcess(doubletotal,doublecurrent);6voidDownLoad();7voidprocess_v1();
Makefile
1 SRC=$(wildcard *.c) 2 OBJ=$(SRC:.c=.o) 3 BIN=processbar 4 5 $(BIN):$(OBJ) 6 gcc -o $@ $^ 7 %.o:%.c 8 gcc -c $< -std=c99 9 .PHONY: 10 clean: 11 rm -f $(OBJ) $(BIN)
最终结果演示

为了降低代码耦合度,也可以这样写
main.c

1#include"process.h"2#include<stdio.h>34doubletotal=1024.0;5doublespeed=1.0;67typedefvoid(*callback_t)(doubletotal,doublecurrent);//定义回调函数89voidDownLoad(callback_tcb)10{11doublecurrent=0;12while(current<=total)13{14cb(total,current);15//下载代码16usleep(10000);//充当下载数据17current+=speed;18}19printf("\ndownload %.21fMB Done\n",total);20}2122intmain()23{24DownLoad(FlushProcess);25// process_v1();26return0;27}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 23:46:51

Python分类汇总怎么做_Crosstab交叉表与多条件联合频数频率统计

pd.crosstab统计全0或报错主因是输入列索引未对齐&#xff0c;应重置索引并保持Series类型&#xff1b;多条件需正确嵌套而非list嵌套&#xff1b;三条件推荐pivot_table。pd.crosstab 为什么统计结果全是0或报错 ValueError: arrays must all be same length常见原因是传入的列…

作者头像 李华
网站建设 2026/4/29 23:28:21

虚拟主播必备!IndexTTS 2.0打造专属声音IP,情感可控超实用

虚拟主播必备&#xff01;IndexTTS 2.0打造专属声音IP&#xff0c;情感可控超实用 1. 为什么虚拟主播需要IndexTTS 2.0&#xff1f; 在虚拟主播和数字人内容爆发的今天&#xff0c;声音IP已经成为个人品牌的重要组成部分。传统语音合成技术面临三大痛点&#xff1a; 音色单一…

作者头像 李华
网站建设 2026/4/29 23:25:21

第十七天 翻转字符串里的单词

一、今日任务题目链接&#xff1a;https://leetcode.cn/problems/reverse-words-in-a-string/视频讲解&#xff1a;https://www.bilibili.com/video/BV1uT41177fX二、今日任务1. 空格逻辑复杂问题2. 单词反转不完整3. 中间出现多个空格三、今日收获学会解决反转字符串单词

作者头像 李华
网站建设 2026/4/29 23:23:34

云原生边缘计算:设计与实践

云原生边缘计算&#xff1a;设计与实践 一、边缘计算的概念与价值 1.1 边缘计算的定义 边缘计算是一种分布式计算范式&#xff0c;将计算、存储和网络资源部署在靠近数据源或用户的边缘位置&#xff0c;以减少延迟、节省带宽、提高安全性和可靠性。在云原生环境中&#xff0c;边…

作者头像 李华
网站建设 2026/4/29 23:23:33

生成对抗网络旋转机械小样本故障诊断【附代码】

✅ 博主简介&#xff1a;擅长数据搜集与处理、建模仿真、程序设计、仿真代码、论文写作与指导&#xff0c;毕业论文、期刊论文经验交流。 ✅ 如需沟通交流&#xff0c;扫描文章底部二维码。&#xff08;1&#xff09;增强型辅助分类生成对抗网络设计&#xff1a;针对旋转机械故…

作者头像 李华