プログレス表示の方法について書きなおしています。以下を参照ください。
コンソールでプログレス表示(アニメーション)(2)
'\r'・CR・Carriage Return・キャリッジリターンの利用
次に紹介するのは、キャリッジリターンを使った方法です。
一般的なC言語の入門書では改行に '\n' (LF・ラインフィード)を使った方法しか説明されていません。
これは、次の行に移るという意味のコードを出力します。
実は、他に行の先頭に移動するという意味のコードがあるのです。それが、 '\r'(CR・キャリッジリターン)です。
この二つは、各 OS でテキスト形式の改行コードに使われています。
Mac 系列では CR 、 Windows 系列では CR+LF 、 UNIX 系列では LF がテキスト形式の改行コードとして使われています。
私が確認したところ、 Windows 系列と UNIX 系列のコンソールで CR を出力すると、カーソルのある行の先頭にカーソルが移動するようです
(Mac は知らない)。こいつを利用してやります。
#include <stdio.h>
#include <time.h>
void hoge();
main(){
int i;
int times=200;
setbuf(stderr,NULL);
for(i=0;i<times;i++){
/* 適当な処理 */
hoge();
/* 進行状況の表示 */
fprintf(stderr,"%3.1d / 200\r",i+1);
}
fprintf(stderr,"\nfinish!!\n");
}
/* 適当な処理をする関数、
いい表現方法が思い浮かばなかったんですんません */
void hoge(){
clock_t t;
/* 時間待ち開始 */
t = clock() + CLOCKS_PER_SEC/20;
while(t>clock());
/* 時間待ち終了 */
}
今回は、 printf の代わりに fprintf を使い、出力先に stderr (標準エラー出力)を指定しています。
こうすると、ログをとるためリダイレクト(コマンドラインで [ 実行ファイル名 ] > [ 出力先ファイル名 ] とする)
などで標準出力先を変更してもコンソールに表示されます。
どちらがいいかはプログラムの目的に応じて変更してください。
これを実行すると、
のように表示されると思います。(JavaScriptによって表現しています)
パーセンテージで表示するようにしてもいいかもしれません。
注意として、キャリッジリターンを出力しただけではその行の文字はそのまま残っています。
ですから、上書きするときは前回出力した文字数以上を出力するか(文字数が少ないときは空白を出力する)、
エスケープシーケンスの機能を使って文字を消すようにしなくてはなりません。
エスケープシーケンスについてはここを参照してください