1. ホーム
  2. command-line

[解決済み] コマンドラインをアニメーションで表示するには?

2023-07-02 17:11:30

質問

私はいつも、人々がどのようにコマンドラインの前の行を更新するのか不思議に思っています。この素晴らしい例は、Linuxでwgetコマンドを使用するときです。これは、次のような ASCII ローディング バーを作成します。

37% [======> ]です。

で、もちろんローディングバーは動き、パーセントも変わりますが、改行されません。どうすればいいのかがわかりません。どなたか正しい方向を教えていただけませんか?

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

私が知る限り、2つの方法があります。

  • バックスペース エスケープ文字 ('\b') を使用して、行を消去する。
  • 行を消すには curses パッケージのバインディングがあれば、それを使います。

そして、Google が明らかにした ANSI エスケープ コード というのがあり、これが良い方法と思われる。参考までに、これを行うためのC++の関数を紹介します。

void DrawProgressBar(int len, double percent) {
  cout << "\x1B[2K"; // Erase the entire current line.
  cout << "\x1B[0E"; // Move to the beginning of the current line.
  string progress;
  for (int i = 0; i < len; ++i) {
    if (i < static_cast<int>(len * percent)) {
      progress += "=";
    } else {
      progress += " ";
    }
  }
  cout << "[" << progress << "] " << (static_cast<int>(100 * percent)) << "%";
  flush(cout); // Required.
}