15

プログレスバーが必要な小さなコンソールアプリを作成しています。何かのようなもの...

Conversion: 175/348 Seconds   |==========          |  50%

私の質問は、コンソールにすでに印刷されている文字をどのように消去するのですか?51パーセントに達したら、コンソールからこの行を消去して、新しい行を挿入する必要があります。私の現在のソリューションでは、これが起こります...

Conversion: 175/348 Seconds   |==========          |  50%
Conversion: 179/348 Seconds   |==========          |  52%
Conversion: 183/348 Seconds   |==========          |  54%
Conversion: 187/348 Seconds   |===========         |  56%

私が使用するコードは...

print "Conversion: $converted_seconds/$total_time Seconds   $progress_bar  $converted_percentage%\n";

私はこれをLinuxでPHPを使用して行っています(私だけがアプリを使用します-言語の選択を許してください)。したがって、ソリューションはLinuxプラットフォームで機能するはずですが、クロスプラットフォームのソリューションがある場合は、それが望ましいでしょう。

4

6 に答える 6

19

言語の選択についてお詫びする必要はないと思います。PHPは、コンソールアプリケーションに最適な言語です。

これを試してみてください:

<?php
for( $i=0;$i<10;$i++){
  print "$i \r";
  sleep(1);
}
?>

「\r」は行を新しいテキストで上書きします。新しい行を作成するには、「\ n」を使用できますが、すでにご存知だと思います。

お役に立てれば!これがLinuxで機能することは知っていますが、Windowsまたは他のオペレーティングシステムで機能するかどうかはわかりません。

于 2009-01-10T07:50:19.827 に答える
9

以前に印刷された文字を消去するには、次の 3 つのオプションがあります。

  • echo chr(8) . " ";後ろの文字をエコーし​​、カーソルを 1 つ後ろに移動し、スペースで文字を上書きします。chr(8)複数の文字を戻すには、連続して複数回使用できます。

  • echo "\r";カーソルを現在の行の先頭に戻します。行を新しいテキストに置き換えることができます。

  • 3 番目のオプションは、ANSI エスケープ コードを使用してカーソル位置の行と列を設定し、置換文字を出力することです。すべての端末で機能するとは限りません。

  function movecursor($line, $column){
      echo "\033[{$line};{$column}H";
  }
于 2010-05-08T17:47:15.793 に答える
8

\r うまくいきました。

今後の参考として、\b は Linux の PHP では機能しません。私は興味があったので、他の言語でもいくつかの実験を行いました (Linux でこれを行いました - 結果が Windows/Mac で同じになるかどうかはわかりません)。

\b 動作環境...

  • パール
  • ルビー
  • Tcl - コード付きputs -nonewline "Hello\b"

\b では機能しません

  • PHP - コードprint "Hello\b";が出力されますHello\b
  • Python コードprint "Hello\b"が出力されHello<new line>ます。と同じ結果print "Hello\b",
于 2009-01-10T08:37:39.917 に答える
4

Linuxでも同じかどうかはわかりませんが、Windowsコンソールアプリでは\ rを印刷すると、カーソルが行の最初の左の位置に戻り、右のすべての文字を上書きできます。

\ bを使用して単一の文字に戻ることができますが、プログレスバーを更新するため、\rは\bx回印刷するよりも簡単に使用できます。

于 2009-01-10T07:45:19.383 に答える
2

これはかなり古いトピックのようですが、私の 5 をドロップします。

for ($i; $i<_POSITION_; $i--) {
   echo "\010"; //issue backspace 
}

かなり前にインターネットで見つけたのですが、残念ながら場所を覚えていません。したがって、すべてのクレジットは元の作者に送られます。

于 2012-10-14T13:37:02.293 に答える
0

以前に印刷された文字を消去するには、その後にバックスペースを印刷します。print "a" print "\ b"

何も印刷されません(実際には印刷されてからバックスペースが印刷されますが、おそらく気付かないでしょう)

于 2009-01-10T07:44:46.157 に答える