dポイントプレゼントキャンペーン実施中!

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

A 回答 (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|
<--[終了]

==============
以上です。参考になれば幸いです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/10/24 01:09

C++になりますが、Boostと言うライブラリの中にそのようなものが有ります。



・progress_display
http://www.kmonos.net/alang/boost/classes/progre …
    • good
    • 0

ncursesでも使ったら?

    • good
    • 0

すみません。

#2です。

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

【修正前】
/* ダミー演算 */
nNum*=2; nNum%=10000;

【修正後】
/* ダミー演算 */
nNum*=2; if( nNum>10000 ) nNum=1;

以上です。失礼致しました。
    • good
    • 0

標準出力がコンソールに結び付けられているなら、putcharなどを使って必要な内容を書くだけです。


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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!