プログレス表示の方法について書きなおしています。以下を参照ください。

コンソールでプログレス表示(アニメーション)(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によって表現しています)
パーセンテージで表示するようにしてもいいかもしれません。
注意として、キャリッジリターンを出力しただけではその行の文字はそのまま残っています。 ですから、上書きするときは前回出力した文字数以上を出力するか(文字数が少ないときは空白を出力する)、 エスケープシーケンスの機能を使って文字を消すようにしなくてはなりません。 エスケープシーケンスについてはここを参照してください



2686875 Today: 726 Yesterday: 881
Twitter
広告