2012-02-07 13 views
5

私はコンソールに現在のステータスをパーセントで表示する小さな関数を作りたいと思います。この関数は、行の現在の値のみを表示する必要があります。 最後の出力を削除する必要があります。それは可能ですか?最善のケースはANSI Cのものですが、プログラムはLinuxとWindowsで動作するはずです。C printfの出力を外す

"\033[J"のようなエスケープシーケンスがいくつか見つかりましたが、機能しません。

編集

まあ私はそれを試してみました:

void PrintProcessBar(int i, int n) { 
    float ratio = i/(float)n;  
    printf("%.3d\b\b", (int)(ratio * 100)); 
    fflush(stdout); 
} 

しかし、それだけで何が悪かったのか...ゼロの多くを印刷しますか?私が3つ使用すると、私は何も得られません。\b

ソリューション

float ratio = (i/(float)n) * 100; 
printf("\b\b\b\b"); 
fflush(stdout); 
printf("%.3d%c", (int)ratio, 37);   
fflush(stdout); 

I =現在の位置。 n = maxが実行されます。

私は4 \bを使用します。これは、関数の最初の呼び出しで4つのスペースが削除されるためです。

Greetz。

+1

回答は質問とは別にしてください。あなた自身の質問に答えるには、このページの下部にある[あなたの質問に答える]ボタンをクリックしてください。 – brandaemon

答えて

10

\bは、バックスペースのエスケープシーケンスです。スペースを使って行を削除することができます。例えば

printf("98%"); 
fflush(stdout); 
// sleep some time 
printf("\b\b\b99%"); 
fflush(stdout); 

これは、98%を印刷した後、99%でそれを置き換える必要があります。

+0

さて、私はそれを試したが、何かが間違っていた。私の**編集**を見てください。ありがとう。グリーツ。 – hofmeister

+0

3文字を印字していますが、毎回2つしか戻っていない場合は、同じ量の印字を返す必要があります(別の\ bは動作するはずです)。 – MByD

+0

私は3つの '\ b'を使うと' printf'は何も印刷しません。 – hofmeister

6

あなたが探しているのは\rです。キャリッジリターンです。キャリッジを行の先頭に戻します。 を使用しないでください。\nを1行下に移動します。

\ rはテキストを削除しないので、単に上書きすることができるため、行をクリアするのに十分なテキスト(必要であればスペース)を必ず印刷する必要があります。

+0

ああ、それはシステムに依存しませんか? –

+0

エンド・ラインは、システムによって異なります(LinuxおよびMacの場合は\ n、ウィンドウの場合は\ r \ n、Acorn BBCおよびRISC OSのスプール・テキスト出力の場合は\ n \ r、Commodoreの場合は\ rです) 8ビットマシン、Acorn BBC、TRS-80、Apple IIファミリ、Mac OSバージョン9、OS-9 [ソース](http://en.wikipedia.org/wiki/Newline) – Eregrith

+0

私はMacを使用して開発のために、最大9 – Eregrith

関連する問題