• ベストアンサー

C言語でプログレスバーを表示する方法について

初めまして。 C言語で、コンソール上にプログレスバーを表示する方法について、 どなたか教えて頂けませんでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
noname#144013
noname#144013
回答No.2

こんにちは。 まず確認なのですが、プログレスバーの表示とは、   処理の【進捗状況】をグラフィカルな伸びていく棒(みたいなもの)で表示させるもの という解釈でよろしいでしょうか? ※見当外れの場合は、申し訳ありません。 上記を前提として、 コンソール画面へのグラフィック表示は難しそうなので(できなくはないと思いますが。。。)、 キャラクタベースで表示するサンプルプログラムを作ってみました。(下記「■サンプルソース」参照) ※ここではエスケープシーケンスを使ってカーソル位置制御を行い、文字'o'を棒に見たてて表示しています。 注)このサンプルは、Windows系OSのコンソールプログラムとして作成しています。   「Window98SE+Visual C++ Ver 5.0」の環境で作成&動作確認を行なっています。   ただし、私はXPとかVista等のマシン環境は持っていなく動作確認していませんので、もし想定している動作   をしなかった場合は、申し訳御座いません。   また、開発環境&コンパイラに依存する部分があるかもしれませんので、質問者さんご利用の開発環境に   合わない部分については、環境に合わせてソースを変更してみて下さい。 なお、本サンプルで使用しているエスケープ・シーケンスに関して下記サイトを参考にさせて頂きました。 (※下記サイト [FPCU]さんに感謝致します。) ■参考サイト ANSI.SYS - キーボードと画面の拡張制御のサポート [FPCU]DOS/V&Windowsコマンド・プロンプト・リファレンス http://www.fpcu.jp/dosvcmd/ansi.htm ■サンプルソース ============== /* * tprg.c :コンソールへのプログレスバー表示テストプログラム *【概要】 * コンソール画面にキャラクタベースでプログレスバー("ooo...ooo")を表示します。 * ・プログレスバーは文字'o'を進捗率に応じて同じ行位置に増加させながら表示を *  行なっています。 *【補足】 * 1)本プログラムは、Windows系OS用のコンソールプログラムです。 * 2)コンソール画面のカーソル位置制御などのために、ANSIエスケープ・ *   シーケンスを使用しています。 *  <使用しているエスケープ・シーケンス> *   ※下記中の"ESC"はエスケープコード(0x1B)を意味します。 *   ・ESC[2J  : 画面消去 *   ・ESC[s  : カーソル位置の保存 *   ・ESC[u  : カーソル位置の復元 *   ・ESC[nnC : カーソルを右にnn桁移動(nnは数字文字) */ #include <stdio.h> #include <string.h> #include <conio.h> /* typedef */ typedef unsigned char BYTE; typedef unsigned short WORD; typedef unsigned long DWORD; int main() { DWORD nCnt1, nCnt2; DWORD nMax1, nMax2; DWORD nPer, nPrg; DWORD nPrgWd; DWORD nNum; int len1, len2; /* プログレス値とプログレスバーの項目名(表示用) */ const char* strItem[] = { "Percentage : ", "ProgressBar: " }; /* ループ回数&プログレスバーの最大幅(文字数)セット */ nMax1=1000; nMax2=250000; nPrgWd = 50; /* 項目名の文字数取得 */ len1 = strlen(strItem[0]); len2 = strlen(strItem[1]); /* 画面クリア&タイトル表示 */ _cputs("\x1b[2J"); //画面クリア _cputs("===コンソールへのプログレスバー表示テスト===\r\n"); _cputs("-->[開始]\r\n"); _cputs("\x1b[s"); //カーソル位置保存 /* プログレス値の初期表示 */ _cputs("\x1b[u"); //カーソル位置復元 _cprintf("%s%u(%%)\r\n", strItem[0], 0); //項目名1+プログレス値(初期値)表示 _cprintf("%s", strItem[1]); //項目名2表示 /* ループ1 */ for( nCnt1=0; nCnt1<nMax1; nCnt1++ ) { /* ループ2 */ for( nNum=1, nCnt2=0; nCnt2<nMax2; nCnt2++ ) { /* ダミー演算 */ nNum*=2; nNum%=10000; } /* プログレス値の計算 */ nPer = (((nCnt1+1) * 100) + (nMax1 / 2)) / nMax1; //プログレス値(進捗率)計算 nPrg = (nPer * nPrgWd) / 100; //プログレスバー用の文字位置計算 /* プログレス値&プログレスバーの表示 */ _cputs("\x1b[u"); //カーソル位置復元 _cprintf("\x1b[%uC%u(%%)\r\n", len1, nPer); //カーソル移動+プログレス値表示 //カーソル移動+プログレスバー表示(約10%毎に表示文字を'|'に切替えています) _cprintf("\x1b[%uC%c", (len2 + nPrg), ((nPrg%(nPrgWd/10))? 'o':'|')); } _cputs("\r\n<--[終了]\r\n"); return 0; } ■実行結果 ===コンソールへのプログレスバー表示テスト=== -->[開始] Percentage : 100(%) ProgressBar: |oooo|oooo|oooo|oooo|oooo|oooo|oooo|oooo|oooo|oooo| <--[終了] ============== 以上です。参考になれば幸いです。

masy0312
質問者

お礼

ご回答ありがとうございました。 非常に勉強になりました!!

その他の回答 (4)

  • sho1get
  • ベストアンサー率57% (20/35)
回答No.5

C++になりますが、Boostと言うライブラリの中にそのようなものが有ります。 ・progress_display http://www.kmonos.net/alang/boost/classes/progress_display.html

  • MASA_H
  • ベストアンサー率42% (64/151)
回答No.4

ncursesでも使ったら?

noname#144013
noname#144013
回答No.3

すみません。#2です。 前記事#2のソースですが、下記のようにダミー演算の個所で修正があります。 ※これはプログレスバー表示の処理には関係なく、どうでもいいことですが、想定していた値  (nNumは1~10000の間で2の倍数値を繰り返す)とはならない処理でしたので修正しました。 ※修正前より進捗速度が速くなるかと思いますが、もし速すぎて確認し辛い場合は、ループ回数  を増やすとか、ダミー演算部分を変更するなどして調整を行なってみてください。 【修正前】 /* ダミー演算 */ nNum*=2; nNum%=10000; 【修正後】 /* ダミー演算 */ nNum*=2; if( nNum>10000 ) nNum=1; 以上です。失礼致しました。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

標準出力がコンソールに結び付けられているなら、putcharなどを使って必要な内容を書くだけです。 標準出力が使えない場合でも、標準エラーがコンソールに結び付けられているなら、putcなどを使って使って書けるはずです。 標準出力も標準エラーも使えないなら、環境次第では、適切なファイル名を指定してコンソールをオープンすれば、書けるようになるかもしれません。

関連するQ&A