c言語でプログレスバーを表示する|ASCIIエスケープコード

どうもながやすです。

先日、C言語でASCII文字がくるくる回るスピナーの作り方を投稿しました

c言語で待ち時間を示すスピナーの簡単な表示法|キャリッジリターン
先日、Bash のシェルスクリプトでスピナーを表示する方法を示しました。スピナーとは、ざっくりいうと待ち時間を示すためのアニメーションですね。下記の例ではアスキー文字「-」「/」「|」「\」の4つを使...

今回は、プログレスバーを作ってみます!

スポンサーリンク

ソースコードと実行例

いきなりコードです。

#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秒たつと終了します。シンプルなプログレスバーですね。

コードの解説

特に難しいコードではないですが、要点は printf("\033[ ですね。
これは ASCII エスケープコード といいます。
これを使うと文字に色をつけたりできます。また、カーソルの位置を変更したりもできます。この碧色工房さんのサイトに詳しい説明が載っています。

今回の例では下記の3つを使用しました。

  • printf("\033[2K") は、その行を削除します
  • printf("\033[G")はカーソルを行頭に移動させます
  • printf("\033[2F")はカーソルを2行上に移動させます
  • これらの他にも色々あります。その気になればいろんなアニメーションが作れます。ちょっとしたCUIでのインタラクティブなプログラムも作れますね。色々遊んでみてください!

    まとめ

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

    今回の投稿は、下記のサイトを参考にさせて頂きました。Go言語でスピナーなどを書く説明をされています。

    『プログラミング言語Go』のスピナー 予約語「go」を使うとメインgoroutineと別のgoroutineで動かせる 『プログラミング言語Go』の「ゴルーチンとチャネル」という章を読んでいて、メインルーチンの処理中にスピナーを回すサンプルコードが出てきたので自分でも試していた。この、スピナーのコードが以下の通り、1文...