ユーザーの待ち時間に表示するようなプログレスバーをC言語で表示する方法を説明します。


ソースコードと実行例

先日、C言語でASCII文字がくるくる回るスピナーの作り方を投稿しました c言語で待ち時間を示すスピナーの簡単な表示法|キャリッジリターン

今回はプログレスバーを表示する方法を示します。 コード例は下記のようになります。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[])
{
    unsigned int i, j;

    for (i = 1; i <= 10; i++) {
        (void) sleep(1);

        printf("\033[2K");
        putchar('[');
        for (j = 0; j < i; j++)
            putchar('#');
        for (; j < 10; j++)
            putchar(' ');
        putchar(']');
        puts("");

        printf("\033[2K\033[G %d sec\n", i);
        printf("\033[2F");
        fflush(stdout); /* バッファを強制的に出力 */
    }

    puts(""); /* 改行表示 */

    return 0;
}

実行結果はこんな感じです。1秒ごとにバーが伸びていき10秒たつと終了します。シンプルなプログレスバーですね。

C言語で実装したプログレスバーの動作アニメーション

コードの解説

特に難しいコードではないですが、要点は printf("\033[ ですね。 これは ANSI エスケープコード といいます。 これを使うと文字に色をつけたりカーソルの位置を変更したりもできます。 ANSIエスケープコードについては碧色工房 - ANSIエスケープコードにわかりやすい詳細説明がされていました。 今回の例では下記の3つを使用しました。

  • printf("\033[2K") その行を削除
  • printf("\033[G") カーソルを行頭に移動
  • printf("\033[2F") カーソルを2行上に移動

これらの他にもいろいろあります。その気になればいろんなアニメーションが作れます。ちょっとしたCUIでのインタラクティブなプログラムも作れますね。いろいろ遊んでみてください!

まとめ

今回はC言語で、ANSIエスケープコードを使ってプログレスバーを書きました。 ANSI エスケープコードを使えば可能性は無限大です!ぜひチャレンジしてみてください!

Note

今回の投稿は今川館 - ANSIエスケープコードを使ってコンソールアニメーションを 参考にさせていただきました。Go言語でスピナーなどを書く説明をされています。