news 2026/6/11 13:46:52

Linux C++ 进度条进阶美化与工程化封装

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Linux C++ 进度条进阶美化与工程化封装

一、ANSI 转义序列:终端色彩与光标控制


Linux 终端支持 ANSI 转义序列,可以实现文字着色、光标移动、清除行等高级效果,是美化进度条的基础。


1.1 常用颜色码(前景色)
颜色代码颜色代码
黑色30红色31
绿色32黄色33
蓝色34紫色35
青色36白色37
1.2 常用光标 / 清屏控制
  • \033[K:清除光标位置到行尾的内容
  • \033[2K:清除整行内容
  • \033[nA:光标向上移动 n 行
  • \033[nB:光标向下移动 n 行

二、版本 4:彩色动态进度条

加入绿色进度条、百分比高亮、完成后变色提示,视觉效果大幅提升。

#include <iostream> #include <unistd.h> #include <string> const int BAR_LEN = 50; // ANSI 颜色宏 #define COLOR_GREEN "\033[32m" #define COLOR_YELLOW "\033[33m" #define COLOR_RED "\033[31m" #define COLOR_RESET "\033[0m" int main() { for (int i = 0; i <= 100; ++i) { int fill = i * BAR_LEN / 100; std::cout << "\r" COLOR_GREEN "["; // 填充部分用绿色 for (int j = 0; j < fill; ++j) { std::cout << "="; } // 箭头用黄色 if (fill < BAR_LEN) { std::cout << COLOR_YELLOW ">"; } // 空白部分重置颜色 std::cout << COLOR_RESET; for (int j = fill + 1; j < BAR_LEN; ++j) { std::cout << " "; } // 百分比数字高亮 if (i == 100) { std::cout << COLOR_GREEN "] " << i << "% 完成" COLOR_RESET; } else { std::cout << "] " COLOR_YELLOW << i << "%" COLOR_RESET; } std::cout.flush(); usleep(40000); } std::cout << std::endl; return 0; }

三、版本 5:带速度与剩余时间估算的进度条


模拟真实任务场景,加入已处理量 / 总量、处理速度、预计剩余时间(ETA),是工程中最实用的版本。

#include <iostream> #include <unistd.h> #include <time.h> #include <string> const int BAR_LEN = 40; #define COLOR_GREEN "\033[32m" #define COLOR_YELLOW "\033[33m" #define COLOR_CYAN "\033[36m" #define COLOR_RESET "\033[0m" int main() { const int total = 200; // 模拟总任务量 time_t start_time = time(NULL); for (int i = 0; i <= total; ++i) { // 计算进度百分比 double percent = (double)i / total * 100; int fill = (int)(percent * BAR_LEN / 100); // 计算速度和剩余时间 time_t now = time(NULL); double elapsed = difftime(now, start_time); double speed = (elapsed > 0) ? (i / elapsed) : 0; int eta = (speed > 0) ? (int)((total - i) / speed) : 0; // 输出进度条 printf("\r" COLOR_GREEN "[" COLOR_RESET); for (int j = 0; j < fill; ++j) printf("="); if (fill < BAR_LEN) printf(COLOR_YELLOW ">" COLOR_RESET); for (int j = fill + 1; j < BAR_LEN; ++j) printf(" "); printf("] "); // 输出详细信息:百分比、已完成/总量、速度、剩余时间 printf(COLOR_YELLOW "%5.1f%%" COLOR_RESET " ", percent); printf("%d/%d ", i, total); printf(COLOR_CYAN "%.1f 个/秒" COLOR_RESET " ", speed); printf("剩余: %d秒", eta); fflush(stdout); usleep(30000); // 模拟每个任务单元的耗时 } printf("\n"); return 0; }
实现逻辑说明
  1. 速度计算速度 = 已完成数量 / 已用时间
  2. 剩余时间估算ETA = (总量 - 已完成量) / 速度
  3. 使用time()函数获取系统时间,difftime()计算时间差,单位为秒。
  4. 适合文件下载、批量处理、数据导入等真实业务场景。

四、版本 6:C++ 类封装工程版

将进度条封装为ProgressBar类,支持自定义样式、颜色、总长度,可直接嵌入项目复用

#ifndef PROGRESS_BAR_H #define PROGRESS_BAR_H #include <string> #include <time.h> class ProgressBar { public: // 构造函数:总任务量、进度条宽度、样式字符 ProgressBar(int total, int width = 50, char fill_char = '=', char arrow_char = '>'); // 更新进度:传入当前已完成量 void update(int current); // 手动设置完成并换行 void finish(); // 是否已经完成 bool is_finished() const { return finished_; } private: int total_; // 总任务量 int width_; // 进度条宽度 char fill_char_; // 填充字符 char arrow_char_; // 箭头字符 int current_; // 当前完成量 bool finished_; // 是否完成 time_t start_; // 开始时间 // 格式化时间显示 std::string format_time(int seconds) const; }; #endif
#ifndef PROGRESS_BAR_H #define PROGRESS_BAR_H #include <string> #include <time.h> class ProgressBar { public: // 构造函数:总任务量、进度条宽度、样式字符 ProgressBar(int total, int width = 50, char fill_char = '=', char arrow_char = '>'); // 更新进度:传入当前已完成量 void update(int current); // 手动设置完成并换行 void finish(); // 是否已经完成 bool is_finished() const { return finished_; } private: int total_; // 总任务量 int width_; // 进度条宽度 char fill_char_; // 填充字符 char arrow_char_; // 箭头字符 int current_; // 当前完成量 bool finished_; // 是否完成 time_t start_; // 开始时间 // 格式化时间显示 std::string format_time(int seconds) const; }; #endif

使用示例 main.cpp

#include "progress_bar.h" #include <unistd.h> int main() { const int TOTAL = 500; ProgressBar bar(TOTAL, 60, '#', '>'); for (int i = 0; i <= TOTAL; ++i) { bar.update(i); usleep(10000); } return 0; }

编译运行:

g++ main.cpp progress_bar.cpp -o progress_bar ./progress_bar

五、进阶扩展:旋转等待指示器

当任务总量未知、只能显示 “正在运行” 时,使用旋转字符动画(| / - \)替代进度条。

#include <iostream> #include <unistd.h> int main() { const char spinner[] = {'|', '/', '-', '\\'}; int idx = 0; std::cout << "正在处理中... "; for (int i = 0; i < 30; ++i) { // 模拟30次循环 printf("\b%c", spinner[idx % 4]); fflush(stdout); idx++; usleep(150000); } printf("\b完成\n"); return 0; }

六、核心总结与注意事项

  1. ANSI 转义序列是 Linux 终端美化的核心,所有主流终端均兼容。
  2. 工程化使用时建议封装为类,支持自定义样式、自动计算速度与 ETA。
  3. 总量未知场景可用旋转指示器替代固定进度条。
  4. 注意事项:
    • 重定向输出到文件时,ANSI 颜色码会变成乱码,生产环境可加判断禁用颜色。
    • 进度更新不要过于频繁(比如每毫秒刷新一次),避免占用过多 CPU。
    • 多线程环境下使用进度条需要加锁,防止输出错乱。
谢谢
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 13:45:51

PCA从数学原理到R手动实现:降维实战与业务可解释性

1. 这不是数学课&#xff0c;而是一次降维实战&#xff1a;为什么PCA必须亲手推一遍再写代码“Mathematics of Principal Component Analysis with R Code Implementation”——这个标题里藏着两个最容易被忽略的真相&#xff1a;第一&#xff0c;“Mathematics”不是让你背公式…

作者头像 李华
网站建设 2026/6/11 13:44:04

JAX函数式编程与XLA编译:高性能AI计算范式解析

1. 为什么JAX不是“又一个深度学习框架”&#xff0c;而是一次底层编程范式的迁移你可能已经用过TensorFlow、PyTorch&#xff0c;甚至写过CUDA kernel——但当你第一次看到jax.jit(jax.grad(loss_fn))(params)这行代码时&#xff0c;大概率会愣住两秒&#xff1a;这玩意儿没定…

作者头像 李华
网站建设 2026/6/11 13:41:17

开源AIOps平台Keep:5分钟构建企业级智能告警管理体系

开源AIOps平台Keep&#xff1a;5分钟构建企业级智能告警管理体系 【免费下载链接】keep The open-source AIOps and alert management platform 项目地址: https://gitcode.com/GitHub_Trending/kee/keep Keep是一款开源的AIOps和告警管理平台&#xff0c;为技术团队提供…

作者头像 李华
网站建设 2026/6/11 13:40:18

禁毒宣传互动展厅设备【毒品场景识别系统】

随着禁毒宣传工作的不断深入&#xff0c;传统单一的文字展板已经难以满足现代化禁毒教育需求。尤其面对新型毒品不断变化、制毒方式更加隐蔽的现状&#xff0c;如何让群众真正看懂毒品、识别毒品、远离毒品&#xff0c;成为禁毒教育建设中的重点方向。禁毒宣传互动展厅设备【毒…

作者头像 李华