linux系统篇(九):告别静态打印:Linux C 实现实时刷新进度条 很多刚接触 Linux C 编程的同学都想做一个能在终端里动态刷新的进度条程序。这不仅能练手 C 语言基础还能顺便搞懂\r、\n和行缓冲区这些关键概念。今天我们就从零开始手把手实现一个可运行的进度条程序。效果图一、先搞懂两个核心概念1. 回车 \r 和换行 \n 的区别很多人会把这两个搞混其实它们的起源来自老式打字机换行 \n把打字机的纸往上移动一行光标留在当前位置的右边。回车 \r把打字机的打印头移动到当前行的最开头不移动纸张。在终端里我们要实现进度条的 “原地刷新” 效果就必须用\r。它会让光标回到行首这样我们每次打印新的进度就会覆盖掉上一次的内容实现动态更新。2. 行缓冲区的坑在 C 语言里printf默认是行缓冲模式只有遇到\n换行符或者程序结束缓冲区的内容才会被真正输出到终端。二、先练手实现一个倒计时程序//100秒倒计时int main(){int time 100;while (time 0){printf(%-3d\r, time);Sleep(1000);time--;}printf(\n);return 0;}三、正式实现进度条程序1.简单实现1.核心逻辑进度条会从左到右填充同时右边的百分比和旋转的加载动画也会同步更新全程都在同一行刷新体验非常丝滑。1.核心操作解析1.buffer开辟数组用来进行进度填充、2.stat旋转逻辑3.rate进度映射2.业务逻辑//proce.h #includestdio.h #includeunistd.h #includestring.h #define N 101 #define STATE # void process(); void FlushProcess(double total, double current); void FlushProcess(double total, double current) { char buffer[N]; const char* stat|/-\\; memset(buffer, 0, sizeof(buffer)); int lenstrlen(stat); int num(int)(current*100/total); static int cnt0; for(int i0;inum;i) { buffer[i]STATE; } double ratecurrent/total; cnt%len; printf([%-100s][%d%%][%c]\r,buffer,(int)(rate*100),stat[cnt]); cnt; fflush(stdout); } int main() { //process(); double current0; while(currenttotal) { FlushProcess(total,current); usleep(3000); currentspeed; } printf(\n); printf(\ndownload %.2lfMB Done\n, current); return 0; }