7

先日、Windows 2000 でコンパイラ (MinGW だったと思いますがよくわかりません) をダウンロードしていました (私は通常 Mac ユーザーですが、私のマシンではありませんでした)。ダウンローダーは MS-DOS でした。ダウンロードの進行状況バーを表示するコマンド ライン アプリ。このようなもの...

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

ただし、同じ行で継続的に更新されます。プログラムは、以前に印刷された文字を削除して別の文字を再印刷することでこれを達成したと思いますが、これを行う方法がわかりません。

「削除」文字をいくつかの異なる方法で印刷しようとしましたが、(char)8や(一部の言語では行の先頭に戻るのを聞いた で\bさえ)、どれも機能しませんでした。\r

この種のことを行う方法を知っている人はいますか?

編集:この質問はプラットフォーム固有になりました。Macでこれを実現する方法を具体的に知りたいです。

4

2 に答える 2

5

問題が発生した理由はわかりませんが、どちら\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);
    }
}
于 2012-06-30T04:32:49.983 に答える
2

ウィキペディアによると:

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

これをチェックしてください:http://msdn.microsoft.com/en-us/library/ms682073.aspx

私はSetConsoleCursorPositionあなたがテキストを置き換えることを可能にするものだと信じています。

于 2012-06-30T04:27:19.127 に答える