首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言實作終端機進度條:從 0% 到 100% 的動態顯示技巧

     編輯:關於C語言

需求場景

在命令列介面(CLI)程式中,長時間執行的任務(如檔案複製、資料處理、下載)需要視覺化進度回饋。一個簡單的文字模式進度條能大幅提升使用者體驗。

核心原理:回車符 \r 與退格符 \b

  • \r (Carriage Return):將游標移至當行行首,不換行。
  • \b (Backspace):將游標左移一格,可配合覆寫實現動畫效果。
  • fflush(stdout):強制刷新輸出緩衝區,確保立即顯示。

完整實作代碼

#include <stdio.h>
#include <unistd.h> // for sleep()

void displayProgress(int progress) {
    // 1. 用退格符清空當前行(假設進度條固定寬度 106 字元)
    for (int k = 0; k < 106; k++) {
        putchar('\b');
    }

    // 2. 繪製已完成部分(用 '+' 表示)
    for (int j = 0; j < progress; j++) {
        putchar('+');
    }

    // 3. 繪製未完成部分(用 '-' 表示)
    for (int j = 0; j < 100 - progress; j++) {
        putchar('-');
    }

    // 4. 顯示百分比數字,%3d 確保寬度固定為 3 字元(含前導空格)
    fprintf(stdout, " %3d%%", progress);

    // 5. 關鍵:刷新緩衝區,否則輸出可能延遲顯示
    fflush(stdout);
}

int main() {
    for (int i = 0; i <= 100; i++) {
        displayProgress(i);
        usleep(50000); // 模擬任務耗時,Linux/macOS 用 usleep,Windows 用 Sleep(50)
    }
    putchar('\n'); // 結束換行
    return 0;
}

關鍵技術細節解析

1. 固定寬度輸出

%3d%% 確保百分比數字始終佔 3 字元(如 5%, 50%, 100%),避免數字位數變化導致進度條抖動。

2. 跨平台睡眠函數

// Linux / macOS
#include <unistd.h>
usleep(50000); // 微秒

// Windows
#include <windows.h>
Sleep(50); // 毫秒

3. 更優雅的清行方式:使用 \r

現代終端機支援 \r 直接回行首,代碼可簡化為:

void displayProgressV2(int progress) {
    printf("\r[");              // 回行首
    for (int i = 0; i < progress; i++) putchar('=');
    for (int i = 0; i < 100 - progress; i++) putchar(' ');
    printf("] %3d%%", progress);
    fflush(stdout);
}

進階擴充建議

  • 多執行緒:將進度條顯示與主任務分離,避免阻塞。
  • 顏色支援:使用 ANSI 轉義碼(如 \033[32m 綠色)美化輸出。
  • 動態寬度:透過 ioctl 或 GetConsoleScreenBufferInfo 取得終端機寬度自適應。
  • 旋轉光標:在無法預估總進度時,顯示 | / - \ 旋轉動畫。

常見坑點

  1. 忘記 fflush(stdout) → 輸出被緩衝,進度條卡住不動。
  2. 在重定向輸出到檔案時,進度條會產生大量垃圾字元 → 建議用 isatty(fileno(stdout)) 判斷是否為終端機。
  3. Windows 控制台預設不支援 ANSI 色碼 → 需呼叫 SetConsoleMode 啟用虛擬終端機序列。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved