掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.29219

コンソールでアニメーション的表示
投稿者---JK(2006/12/13 00:56:16)


linux等で、コンソールからダウンロードをすると、

$*** 30% | =====            | 1.1MB

といった表示が

$*** 100% | ==================== | 1.1MB

になるまで
=が徐々に増えていくようなものがありますが、
どのような処理を行っているのでしょう?

c言語のprintfなどで可能なものでしょうか?


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:コンソールでアニメーション的表示 29220 kolona 2006/12/13 01:36:23


No.29220

Re:コンソールでアニメーション的表示
投稿者---kolona(2006/12/13 01:36:23)


簡単な方法は制御コードをprintfで出力することです。
このHPのASCIIコード表(http://www9.plala.or.jp/sgwr-t/c_sub/ascii.html)を参照してもらえばわかりますが、文字コード13に割り当てられているのは復帰です。
これをコンソールに出力すると(通常は)文字の表示開始位置が一番左に移動します。

たとえばこんな感じ。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int main(void){

int x,y;

for(x=0;x<20;x++){
    for(y=x;y>0;y--)printf("=");
    printf("x=%d",x);
    Sleep(200);
    printf("%c",13);//復帰文字の出力
}

return 0;
}


ただし、これは文字コードに依存します。
環境がLinuxなら、上のコードのSleep関連を直せばそのまま動くと思います。



この投稿にコメントする

削除パスワード

No.29224

Re:コンソールでアニメーション的表示
投稿者---nicht sein(2006/12/13 12:06:27)


>ただし、これは文字コードに依存します。
>環境がLinuxなら、上のコードのSleep関連を直せばそのまま動くと思います。

13を直接指定せずに、'\r'を指定すれば環境依存にならず復帰できると思います。


この投稿にコメントする

削除パスワード

No.29233

Re:コンソールでアニメーション的表示
投稿者---JK(2006/12/13 16:58:30)


レスありがとうございます。

早速乗せていただいたコードを多少修正してLinux(red hat コンパイラcc)で実行してみたのですが、
何も表示されずに終了してしまいます。

ちなみに修正したのは、
13→'\r'
Sleep(200)→sleep(2) 
といった点です。
なんだか表示した瞬間に消されているのかなと思われるのですが、
どうでしょう?



この投稿にコメントする

削除パスワード

No.29235

Re:コンソールでアニメーション的表示
投稿者---kolona(2006/12/13 17:46:13)



>何も表示されずに終了してしまいます。
>
>ちなみに修正したのは、
>13→'\r'
>Sleep(200)→sleep(2) 
>といった点です。

sleepは復帰する前に表示しておく時間稼ぎです。少なすぎた場合、かなりの
動体視力が要求されます。


この投稿にコメントする

削除パスワード

No.29238

Re:コンソールでアニメーション的表示
投稿者---JK(2006/12/14 00:35:29)


ありがとうございます。
sleep(2)としたのは、linuxでのsleepの引数は秒数になるようで、
windowsでのSleep(200)と同じようにするためです。
ちゃんと2秒sleepはしているようなのですが・・・・。


この投稿にコメントする

削除パスワード

No.29237

Re:コンソールでアニメーション的表示
投稿者---yoh2(2006/12/14 00:06:41)


>なんだか表示した瞬間に消されているのかなと思われるのですが、
>どうでしょう?

表示された瞬間に消えるのではなく、出力がバッファリングされ、ループ中に何も
出力されていないのでしょう。

1. ループ中: 間に'\r'を挟みつつ"=" から "===================" までprintf()
されるも、バッファリングされコンソールに出力されず。
(出力: なし)

2. プログラム終了直前: バッファがフラッシュされて、最後の結果だけ出力される。
(出力: =================== )

3. プログラム終了後: プログラムで出力した内容がシェルプロンプトに上書きされる。
(出力: プロンプト文字列)

ここで、2と3の間が一瞬なので、最終的にも何も出力されていないように見えるわけです。

ループ中に出力させるには、一行出力終了後、sleep()直前あたりにfflush(stdout)を
入れるとよいです。


この投稿にコメントする

削除パスワード

No.29240

Re:コンソールでアニメーション的表示 解決しました。
投稿者---JK(2006/12/14 00:59:28)


>ループ中に出力させるには、一行出力終了後、sleep()直前あたりにfflush(stdout)を
>入れるとよいです。

おっしゃるとおりfflushを入れたところ思っていた動きが再現できました。

丁寧に説明ありがとうございました。
いまいちまだ理解できてはいないんですがいろいろ試してみたいと思います。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧