Linux---进度条小程序

发布时间:2026/9/28 8:16:10

Linux---进度条小程序 前言在学习Linux编程的过程中编写一个进度条小程序是一个经典且极具教育意义的练手项目。它看似简单却涵盖了C语言中缓冲区机制、转义字符、格式化输出等多个重要知识点。本文将带你从零开始一步步理解并实现一个属于自己的进度条。一、预备知识回车与换行在正式编写进度条之前我们首先需要搞清楚两个基本概念回车Carriage Return和换行Line Feed。在日常使用电脑时我们习惯性地按下键盘上的Enter键来完成“回车换行”但实际上回车和换行是两个独立的动作回车\r将光标移动到当前行的最左侧行首换行\n将光标在竖直方向上向下移动一行水平位置保持不变在C语言中\n同时完成了回车和换行两个动作而\r则只实现回车的功能。理解这一点对于实现进度条至关重要——我们希望在原地不断更新进度显示而不是每次都换行输出。二、行缓冲区被“延迟”的打印先来看一段简单的代码#include stdio.h #include unistd.h int main() { printf(hello linux\n); sleep(3); return 0; }运行这段代码屏幕上会先打印出“hello linux”然后程序休眠3秒后退出。现在我们把\n去掉#include stdio.h #include unistd.h int main() { printf(hello linux); sleep(3); return 0; }神奇的事情发生了程序先休眠了3秒然后才在屏幕上打印出“hello linux”这是否意味着程序先执行了sleep后执行了printf当然不是——C程序永远是严格按照代码顺序执行的。真正的原因是数据并没有立即被送到屏幕上而是先被存放在了缓冲区Buffer中。缓冲区是C语言维护的一段内存默认情况下只有当程序结束时才会将缓冲区中的内容刷新flush到屏幕上。那么如何强制刷新缓冲区呢有以下几种方式使用\n换行符会触发缓冲区刷新程序正常结束自动刷新缓冲区调用fflush(stdout)手动强制刷新标准输出缓冲区我们可以通过fflush(stdout)来验证#include stdio.h #include unistd.h int main() { printf(hello linux); fflush(stdout); // 强制刷新缓冲区 sleep(3); return 0; }这次屏幕上会先打印出“hello linux”然后程序休眠3秒三、练手小项目倒计时程序有了上面的知识储备我们先来实现一个简单的倒计时程序练练手。倒计时要求从10开始每秒更新一次数字直到0且所有数字显示在同一行。#include stdio.h #include unistd.h int main() { int i 10; while (i 0) { printf(%-2d\r, i); // \r回车%-2d左对齐占2位 fflush(stdout); // 强制刷新缓冲区 i--; sleep(1); } printf(\n); return 0; }关键点解析使用\r而非\n\r让光标回到行首新数字会覆盖旧数字从而实现“原地更新”的效果使用fflush(stdout)因为\r不会自动刷新缓冲区必须手动刷新才能立即看到输出使用%-2d格式化控制数字10占两个字符位置如果只用%d从10变成9时只会覆盖第一个字符留下一个“0”的残影四、终极目标进度条小程序4.1 效果演示进度条的核心原理是用一个字符数组如#不断填充配合\r回到行首重新打印制造出进度条不断“增长”的视觉效果。4.2 完整代码实现process.h#pragma once #include stdio.h void process_v1(); void FlushProcess(double total, double current);process.c#include process.h #include string.h #include unistd.h #define NUM 101 #define STYLE # // 版本1简单进度条 void process_v1() { char buffer[NUM]; memset(buffer, 0, sizeof(buffer)); const char* lable |/-\\; int len strlen(lable); int cnt 0; while (cnt 100) { printf([%-100s][%d%%][%c]\r, buffer, cnt, lable[cnt % len]); fflush(stdout); buffer[cnt] STYLE; cnt; usleep(50000); // 50ms } printf(\n); } // 版本2可模拟下载进度的进度条 void FlushProcess(double total, double current) { char buffer[NUM]; memset(buffer, 0, sizeof(buffer)); const char* lable |/-\\; int len strlen(lable); static int cnt 0; int num (int)(current * 100 / total); for (int i 0; i num; i) { buffer[i] STYLE; } double rate current / total; cnt % len; printf([%-100s][%.1f%%][%c]\r, buffer, rate * 100, lable[cnt]); cnt; fflush(stdout); }main.c#include process.h #include stdio.h #include unistd.h double total 1024.0; double speed 1.0; void Download() { double current 0; while (current total) { FlushProcess(total, current); usleep(3000); // 模拟下载耗时 current speed; } printf(\ndownload %.2lfMB Done\n, current); } int main() { Download(); return 0; }MakefileSRC $(wildcard *.c) OBJ $(SRC:.c.o) BIN processbar $(BIN): $(OBJ) gcc -o $ $^ %.o:%.c gcc -c $ .PHONY: clean clean: rm -f $(OBJ) $(BIN)若报这个错在较老的 GCC 版本如 CentOS 7 自带的 GCC 4.8.x中默认编译标准是C89/C90或gnu90可修改Makefile中结果4.3 代码深度解析1为什么用\r而不是\n进度条需要在一行中不断更新如果使用\n每打印一次就会换一行产生“滚屏”效果。而\r让光标回到行首下一次打印会覆盖上一次的内容从而实现动态更新的视觉效果。2为什么每次都要fflush(stdout)\r不会触发缓冲区刷新。如果不手动刷新数据会一直待在缓冲区里直到程序结束才一次性输出——那样我们就看不到动态的进度效果了。3旋转光标lable数组的作用const char* lable |/-\\;这个数组中的四个字符|、/、-、\轮流出现模拟出一个旋转的“小转盘”让进度条看起来更生动。4usleep的作用usleep(50000)表示休眠50,000微秒即50毫秒控制进度条更新的速度。太快了看不清太慢了显得卡顿。5版本2的设计思路版本2的FlushProcess函数将进度条封装成了一个可复用的模块——传入总大小和当前已完成的大小函数自动计算百分比并绘制进度条。这种设计更贴近实际开发场景比如文件下载、软件安装等需要显示进度的功能。五、总结通过编写这个进度条小程序我们系统地学习了以下知识点知识点核心内容回车 vs 换行\r回车到行首\n换行到下一行行缓冲区数据先存缓冲区程序结束或刷新时才输出强制刷新fflush(stdout)手动刷新缓冲区格式化输出%-2d控制位宽和对齐方式动态更新\rfflush实现原地刷新进度条虽小却是一个“麻雀虽小五脏俱全”的经典项目。它不仅是Linux C编程的入门练习更是一个理解I/O缓冲机制和终端控制的绝佳窗口。
延伸阅读

更多相关文章

2026/9/19 12:17:17

用C# WinForms开发定时自动清理过期文件的小工具

简介:这是一份面向C#初学者与Windows桌面应用开发者的实用工具型资源,解决日常文件管理中临时文件、日志等周期性清理难题。用户无需编程基础,双击exe即可启动定时删除任务;开发者可基于完整源码快速定制路径、条件与日志策略。压…

2026/9/23 23:54:44

MATLAB App Designer开发实战:从界面搭建到Simulink联动与打包发布

开头如果你只是偶尔用 MATLAB 算个矩阵、画个曲线,可能永远不会觉得 MATLAB 的界面开发功能有什么价值。但如果你是做算法验证、信号处理或者科研项目,迟早会面对一个尴尬的现实:算法跑通了,模型也搭好了,却不知道该怎…

2026/9/28 8:12:26

SSM、Transformer与RNN:统一序列建模的三大坐标

1. 这不是又一个“Transformer vs RNN”的老调重弹,而是重新理解序列建模的底层坐标系你有没有试过,在深夜调试一个RNN模型时,突然发现梯度消失得比咖啡凉得还快;或者在跑完一个12层Transformer后,盯着显存占用率98%的…

2026/9/28 8:12:26

实测7个AI论文生成网站:从内容生成到LaTeX模板一键适配

写论文的人都知道,最折磨人的往往不是“没内容可写”,而是把内容塞进一堆格式规范里:标题字号、摘要结构、参考文献样式、图表位置,每一项都能让你在本该看数据的周五晚上对着期刊模板干瞪眼。而这两年AI写论文相关的工具越来越多…

2026/9/28 8:12:26

网站没有备案是假的吗速查手册

网站没备案是假的吗?3个信号判断真假,建站到底多少钱 网站做好了没人访问,这感觉比丢钱还难受。很多老板问我,我花了几万块做的站,搜“网站没有备案是假的吗”一看,我的站竟然打不开,或者显示违规信息,这是不是网站就是假的?更扎心的是,当初报价时…

2026/9/28 8:12:26

IM消息转发子服务:从拆分到高并发落地的完整复盘

做IM后端这几年,我最大的一个体会是:消息转发这层,看着只是把A的话传给B,一旦上了规模、上了多端、上了群聊,它就成了整个系统里最容易翻车的部位。早期我们第一版IM甚至没有独立的“消息转发子服务”,代码…

2026/9/28 8:12:26

FPGA网表加密实战:紫光同创PDS中ADF文件生成与安全交付指南

1. 为什么FPGA项目需要“黑匣子”式交付做FPGA这行十几年,最头疼的从来不是写代码,而是交付。你辛辛苦苦调了三个月的时序,好不容易把图像处理流水线跑到200MHz,结果客户拿到源码转头就交给别人改,改崩了还回来找你。更…

2026/9/28 8:07:26

9.9华为OD机试真题 新系统 - 受限任务分配 (Java/Py/C/C++/Js/Go)

受限任务分配 2026 华为OD机试真题 4月15日华为OD上机新系统考试真题 100 分题型 点击查看华为 OD 机试真题完整目录:2026最新华为OD机试新系统卷 + 双机位C卷 真题题库目录|全覆盖题库 + 逐点算法考点详解 题目描述 某部门有一批待处理任务,数量为 x;系统按轮次处理任务…

2026/9/28 3:03:23

东莞市品牌网站建设报价常见报错与解决

东莞品牌网站建设报价单背后:一份保姆级建站教程避坑实录 网站做好了没人访问,这大概是很多老板最头疼的事。花了大几万做的品牌站,上线后流量惨淡,比路边摊还冷清。别急着骂外包公司,很多“东莞品牌网站建设报价”里藏着不少猫腻,比如用模板站冒充定制…

2026/9/28 6:05:15

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/28 6:07:41

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/28 0:02:03

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑

广州外贸网站建设推广:从零搭建全流程拆解与真实报价避坑 改个需求建站公司拖一周,后台改个文案还得再交一笔“技术维护费”。这种憋屈事儿,做外贸的朋友太熟悉了。很多老板在找广州外贸网站建设推广服务商时,光盯着首页好不好看,却忽略了从零搭建一个能…

2026/9/28 0:02:04

搞懂百度竞价推广价格,网站性能优化别掉链子

搞懂百度竞价推广价格,网站性能优化别掉链子 网站突然打不开,浏览器弹出红色警告“此网站存在安全风险”,后台一看全是乱码代码和奇怪的跳转链接。这种网站被黑挂马的绝望感,很多刚转行做网站的朋友都经历过,尤其是那些为了省几百块钱服务器费用的新手。…

2026/9/25 20:55:38

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/26 19:58:38

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/28 1:59:25

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…

还想了解更多?直接咨询顾问

免费诊断 + 免费方案 + 透明报价。

全国咨询热线400-8866-253
免费获取方案
☎咨询二维码 ☎ ↑