1. ホーム
  2. c++

[解決済み] ピュアC/C++(cout/printf)でプログレスインジケータを表示するには?

2023-02-16 12:41:08

質問

C++で、大きなファイルをダウンロードするコンソールプログラムを書いています。私はファイルサイズを知っていて、それをダウンロードするために作業スレッドを開始します。私はそれをよりクールに見せるために進行状況インジケータを表示したい。

coutやprintfで、異なるタイミングで異なる文字列を、同じ位置に表示するにはどうしたらよいでしょうか。

どのように解決するのですか?

出力の幅が固定されている場合、以下のようなものを使用します。

float progress = 0.0;
while (progress < 1.0) {
    int barWidth = 70;

    std::cout << "[";
    int pos = barWidth * progress;
    for (int i = 0; i < barWidth; ++i) {
        if (i < pos) std::cout << "=";
        else if (i == pos) std::cout << ">";
        else std::cout << " ";
    }
    std::cout << "] " << int(progress * 100.0) << " %\r";
    std::cout.flush();

    progress += 0.16; // for demonstration only
}
std::cout << std::endl;

http://ideone.com/Yg8NKj

[>                                                                     ] 0 %
[===========>                                                          ] 15 %
[======================>                                               ] 31 %
[=================================>                                    ] 47 %
[============================================>                         ] 63 %
[========================================================>             ] 80 %
[===================================================================>  ] 96 %

なお、この出力は 表示 の一行下に表示されますが、ターミナルエミュレータでは (Windows のコマンドラインでも同様だと思います)、次のように表示されます。 と表示され、同じ行に .

一番最後に、さらに何かを印刷する前に改行を印刷することを忘れないでください。

最後のバーを削除したい場合は、空白で上書きして、例えば次のような短いものを印刷しなければなりません。 "Done." .

また、もちろん同じことが printf を使っても同じことができます。上記のコードを適応させるのは簡単でしょう。