C コンソール アプリで画面を更新したい。コンソールの進行状況バーを実行したい。どうやって?これを見てください:
ダウンロード中...に:
|==== | 34%
ダウンロード中...これらは同じ行にある必要があり、その行を更新する必要があります。
|===== | 50%
この例を見てみましょう: http://www.rosshemsley.co.uk/2011/02/creating-a-progress-bar-in-c-or-any-other-console-app/
ポイントは:
端末が次のシンボルをコマンドとして実行することを認識できるように、最初に正しいエスケープ シーケンスを記述する必要があります。C では、このエスケープ コードは「\033[」です。次に、これに好きなコマンドを続けます。この例では、「\033[F」を使用して 1 行上に移動し、「\033[J」を使用して行をクリアします。 . これにより、ロードバーがあった行が消去され、同じ行を再度書き直せるようにカーソルが配置されます。
// Process has done i out of n rounds,
// and we want a bar of width w and resolution r.
static inline void loadBar(int x, int n, int r, int w)
{
// Only update r times.
if ( x % (n/r) != 0 ) return;
// Calculuate the ratio of complete-to-incomplete.
float ratio = x/(float)n;
int c = ratio * w;
// Show the percentage complete.
printf("%3d%% [", (int)(ratio*100) );
// Show the load bar.
for (int x=0; x<c; x++)
printf("=");
for (int x=c; x<w; x++)
printf(" ");
// ANSI Control codes to go back to the
// previous line and clear it.
printf("]\n\033[F\033[J");
}
多くのシステムでは、行を上書きするために \r を使用できます。何らかの方法で行をフラッシュする必要があります。
static const char equals[] = "=====....====="; // 合計 = 50 個 フロートパーセント; // パーセンテージ...フローティングが必要だと仮定 int p; // 整数パーセンテージ タグ for (パーセント = 0.0; パーセント < 100.0; パーセント++ ) { p = パーセント + 0.5; fprintf( stdout, "\r|%.*s | %d", p/2,equals, p ); fflush(stdout); // \n がなくても行が書き込まれることを保証します } p = パーセント + 0.5; printf( "\r|%.*s | %d\n", p/2,equals, p ); // 最終行に \n
今こそ、読者がコンパイルもテストもされていないコードに注意するときです。
\b
chars を使用するだけで、行をクリアできます。printf("\b\b\b\b\b\b%5d",value); fflush(stdout)
. これは非常に簡単な方法です。もちろん、より複雑なこと、複数行の編集、座標管理が必要な場合は、curses の使用を検討する必要があります。