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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# exeファイルが作れない(windows10) 6 2022/08/13 08:47
- C言語・C++・C# 画像の画素値を変えるC言語のプログラムで指定された画像の中に白い三角形を右上に表示させるにはどのよう 3 2022/10/30 01:16
- Excel(エクセル) 関数について 1 2022/10/14 11:55
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
- ドライブ・ストレージ HDDの未割り当て領域が認識されない 7 2022/11/27 18:51
- 哲学 日本語は 言語類型として あたかも始原のごとくである 3 2022/05/29 04:41
- C言語・C++・C# gettimeofday() と localtime_r() を使って現在の日時をマイクロ秒単位で表 2 2022/10/26 21:15
- ドライブ・ストレージ ノートパソコンでSSD250GBのうちローカルディスクC分の140GBしか表示されていません 正常に 3 2022/06/04 17:33
- Excel(エクセル) Excelヘルプの原文を表示する最速の方法(手順)には? 1 2023/08/11 11:30
- その他(言語学・言語) ピダハン語 2 2022/07/14 12:41
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6 開発環境のエディタに行...
-
フォーム上で押されたボタンに...
-
リクエストに応じたselectedの...
-
Java-jspの画面入力値保持について
-
webアプリを作ってます。エラー...
-
「<c:forEach タグが終了し...
-
三菱GOTの画面切り替えについて
-
jspからServletを呼び、元のjsp...
-
ServletからServletへの値渡し
-
jspファイルで注文フォームの合...
-
C言語で今まで表示していた画面...
-
Strutsで、どのRadioボタンが選...
-
フォームで同じ複数のnameで違...
-
JSPからJSPへ情報を渡せる?
-
javascriptでセッションを取得
-
遷移元を判定したい!
-
漏電遮断器の黄色ボタンと白色...
-
C# ログイン画面からメイン画面...
-
ラジオボタンの選択肢をサーブ...
-
VBAでTIFF画像を読み込むには?
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6 開発環境のエディタに行...
-
フォルダ改行
-
C言語でプログレスバーを表示す...
-
Excelでの二桁数字表示
-
4K (3840×2160) の画像を解像度...
-
vbsでieを操作するスクリプトを...
-
HPでの発音記号の表示の仕方
-
WindowsLiveムービーメーカー保...
-
excel2000で、二重波線でグラフ...
-
word2010 不必要なページの削除法
-
アンドロイド グーグルカレンダ...
-
( ⌒⃘ཽ⃜ ◞ළ ◟ ⌒⃘ཽ⃜ ) Շ”ਭ꒭ね~❤⃛...
-
Office製品の画像などが正常に...
-
eclipse 実行結果
-
Wood 2002について
-
皆さんのパソコン及びスマホは...
-
フォーム上で押されたボタンに...
-
リクエストに応じたselectedの...
-
jspからServletを呼び、元のjsp...
-
Java-jspの画面入力値保持について
おすすめ情報