2012-06-30 17 views
5

先日Windows 2000でコンパイラをダウンロードしていましたが(私はそれはMinGWだと思いますが、わかりません)(私は一般的にMacユーザーですが、私のマシン)、そしてダウンローダはMS-DOSのコマンドラインアプリケーションで、ダウンロードの進行状況を表示します。このようなもの...C++のコマンドラインから印刷された文字を削除する方法

|---     | 15% 
... 
|------    | 30% 
... 
... 
|--------------  | 70% 

ただし、同じ行で連続的に更新される点が異なります。私はプログラムが以前に印刷された文字を削除し、別のものを再印刷することによってこれを達成したと仮定しますが、これを行う方法を理解できないようです。

私は(私はいくつかの言語での行の先頭にバックトラックを聞いても、\r、)(char)8\bなどの「削除」の文字いくつかの異なる方法を、印刷しようとしたが、それらのもののどれも働きました。

誰もこの種のものを行う方法を知っていますか?

編集:この質問はプラットフォームによって異なります。 Macでこれを達成する方法を具体的に知りたい。

+0

「clrscr」は行いますか? –

+1

関連:http://stackoverflow.com/questions/60221/how-to-animate-the-command-line?rq=1 – Pubby

+0

clrscrは画面全体をクリアしますが、マックではすべての改行を印刷します画面からすべてを移動します(つまり、スクロールすることができますが、これは便利ですが、迷惑です)。 – anthropomorphic

答えて

2

to Wikipediaよる:

Win32コンソールは、すべてのANSIエスケープシーケンスをサポートしていません。ソフトウェアは、ioctlのようなコンソールAPIをテキスト出力とインターレースしてコンソールを操作できます。一部のソフトウェアは、印刷中のテキスト中のANSIエスケープシーケンスを内部的に解釈し、それらをこれらの呼び出しに変換します。

このチェックアウト:私はSetConsoleCursorPositionはあなたがテキストを置き換えることができます何であると考えていhttp://msdn.microsoft.com/en-us/library/ms682073.aspx

を。

4

問題に遭遇した理由はわかりませんが、\b or \rを使用してこれを使用することができます。\bを使用しました。

#include <iostream> 
#include <iomanip> 
#include <string> 
#include <windows.h> 

// This is the only non-portable part of this code. 
// Simply pause for a specified number of milliseconds 
// For Windows, we just call Sleep. For Linux, you'd 
// probably call nanosleep instead (with a suitable 
// multiplier, of course). Most other systems (presumably) 
// have (at least vaguely) similar capabilities. 
void pause(int ms) { 
    Sleep(ms); 
} 

static const int width = 40;  

void show_percent(int i) { 
    int dashes = (width * i)/100; 

    std::cout << '|' << std::left << std::setw(width) << std::string(dashes, '-') << '|' << std::setw(3) << i << "%"; 
} 

int main() { 

    for (int i=0; i<101; i++) { 
     show_percent(i); 
     std::cout << std::string(width+6, '\b'); 
     pause(100); 
    } 
} 
+0

私はC++ 11でそれを行うポータブルな方法は 'std :: this_thread :: sleep_for(std :: chrono :: milliseconds(ms));' – anthropomorphic

+0

と思います。私はあなたのshow_percentコードにとても感銘を受け、 '\ r'のことはまったくうまくいきませんでした。私はそれがWindows、Mac OS X、Linuxが改行を表す方法の違いと関係していると思う。 – anthropomorphic

+0

@MichaelDorst:ええと、あなたがそれを言及するまでは考えていませんでしたが、Macでは長年に渡って「改行」文字として '\ r'を使っていましたので、それはおそらく驚くことではありません正常なシステム上と同じように、現在の行頭に戻ります。私はテストするMacを持っていませんが、上記の修正されたコードがうまく動作するかどうかを確認してください。 –

関連する問題