- ベストアンサー
C言語でプログレスバーを表示する方法について
初めまして。 C言語で、コンソール上にプログレスバーを表示する方法について、 どなたか教えて頂けませんでしょうか?
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
こんにちは。 まず確認なのですが、プログレスバーの表示とは、 処理の【進捗状況】をグラフィカルな伸びていく棒(みたいなもの)で表示させるもの という解釈でよろしいでしょうか? ※見当外れの場合は、申し訳ありません。 上記を前提として、 コンソール画面へのグラフィック表示は難しそうなので(できなくはないと思いますが。。。)、 キャラクタベースで表示するサンプルプログラムを作ってみました。(下記「■サンプルソース」参照) ※ここではエスケープシーケンスを使ってカーソル位置制御を行い、文字'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| <--[終了] ============== 以上です。参考になれば幸いです。
その他の回答 (4)
- sho1get
- ベストアンサー率57% (20/35)
C++になりますが、Boostと言うライブラリの中にそのようなものが有ります。 ・progress_display http://www.kmonos.net/alang/boost/classes/progress_display.html
- MASA_H
- ベストアンサー率42% (64/151)
ncursesでも使ったら?
すみません。#2です。 前記事#2のソースですが、下記のようにダミー演算の個所で修正があります。 ※これはプログレスバー表示の処理には関係なく、どうでもいいことですが、想定していた値 (nNumは1~10000の間で2の倍数値を繰り返す)とはならない処理でしたので修正しました。 ※修正前より進捗速度が速くなるかと思いますが、もし速すぎて確認し辛い場合は、ループ回数 を増やすとか、ダミー演算部分を変更するなどして調整を行なってみてください。 【修正前】 /* ダミー演算 */ nNum*=2; nNum%=10000; 【修正後】 /* ダミー演算 */ nNum*=2; if( nNum>10000 ) nNum=1; 以上です。失礼致しました。
- jacta
- ベストアンサー率26% (845/3158)
標準出力がコンソールに結び付けられているなら、putcharなどを使って必要な内容を書くだけです。 標準出力が使えない場合でも、標準エラーがコンソールに結び付けられているなら、putcなどを使って使って書けるはずです。 標準出力も標準エラーも使えないなら、環境次第では、適切なファイル名を指定してコンソールをオープンすれば、書けるようになるかもしれません。
お礼
ご回答ありがとうございました。 非常に勉強になりました!!