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|
<--[終了]
==============
以上です。参考になれば幸いです。
No.5
- 回答日時:
C++になりますが、Boostと言うライブラリの中にそのようなものが有ります。
・progress_display
http://www.kmonos.net/alang/boost/classes/progre …
No.3
- 回答日時:
すみません。
#2です。前記事#2のソースですが、下記のようにダミー演算の個所で修正があります。
※これはプログレスバー表示の処理には関係なく、どうでもいいことですが、想定していた値
(nNumは1~10000の間で2の倍数値を繰り返す)とはならない処理でしたので修正しました。
※修正前より進捗速度が速くなるかと思いますが、もし速すぎて確認し辛い場合は、ループ回数
を増やすとか、ダミー演算部分を変更するなどして調整を行なってみてください。
【修正前】
/* ダミー演算 */
nNum*=2; nNum%=10000;
【修正後】
/* ダミー演算 */
nNum*=2; if( nNum>10000 ) nNum=1;
以上です。失礼致しました。
No.1
- 回答日時:
標準出力がコンソールに結び付けられているなら、putcharなどを使って必要な内容を書くだけです。
標準出力が使えない場合でも、標準エラーがコンソールに結び付けられているなら、putcなどを使って使って書けるはずです。
標準出力も標準エラーも使えないなら、環境次第では、適切なファイル名を指定してコンソールをオープンすれば、書けるようになるかもしれません。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
許せない心理テスト
私は「あなたの目の前にケーキがあります。ろうそくは何本刺さっていますか」と言われ「12本」と答えたら…
-
フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
あなたが普段思っている「これまだ誰も言ってなかったけど共感されるだろうな」というあるあるを教えてください
-
映画のエンドロール観る派?観ない派?
映画が終わった後、すぐに席を立って帰る方もちらほら見かけます。皆さんはエンドロールの最後まで観ていきますか?
-
海外旅行から帰ってきたら、まず何を食べる?
帰国して1番食べたくなるもの、食べたくなるだろうなと思うもの、皆さんはありますか?
-
天使と悪魔選手権
悪魔がこんなささやきをしていたら、天使のあなたはなんと言って止めますか?
-
fgetsなどのときのstdinのバッファを消すには?
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6 開発環境のエディタに行...
-
フォルダ改行
-
ジオのHP(HPビルダーでiモー...
-
ボタンが活性化の場合とは、ボ...
-
三菱GOTの画面切り替えについて
-
javascriptでセッションを取得
-
ActiveWorkbook.Pathの一つ下の...
-
C言語で今まで表示していた画面...
-
リクエストに応じたselectedの...
-
漏電遮断器の黄色ボタンと白色...
-
ある環境のみinputタグが複数あ...
-
グローバルIPアドレスの変更タ...
-
フォーム上で押されたボタンに...
-
ラジオボタンの選択肢をサーブ...
-
Wi-Fiのパスワードが指定なしと...
-
登録済みイベントリスナーの情...
-
Struts2のファイルアップロード...
-
検索後のページ再表示初期化
-
フォームで同じ複数のnameで違...
-
画像の縦横比固定の計算方法。
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6 開発環境のエディタに行...
-
フォルダ改行
-
Office製品の画像などが正常に...
-
Excelでの二桁数字表示
-
DirectXの文字表示について(int...
-
vbsでieを操作するスクリプトを...
-
C言語でプログレスバーを表示す...
-
4K (3840×2160) の画像を解像度...
-
WindowsLiveムービーメーカー保...
-
アンドロイド グーグルカレンダ...
-
皆さんのパソコン及びスマホは...
-
word2010 不必要なページの削除法
-
腕時計の時報をならないように...
-
三菱GOTの画面切り替えについて
-
ボタンが活性化の場合とは、ボ...
-
リクエストに応じたselectedの...
-
「<c:forEach タグが終了し...
-
グローバルIPアドレスの変更タ...
-
漏電遮断器の黄色ボタンと白色...
-
フォーム上で押されたボタンに...
おすすめ情報