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";

我正在使用 PHP 在 Linux 中执行此操作(只有我会使用该应用程序 - 所以请原谅语言选择)。因此,该解决方案应该可以在 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

要擦除以前打印的字符,您有三个选项:

  • echo chr(8) . " ";回显后面的字符,并将光标向后移动一位,然后空格覆盖字符。您可以chr(8)连续使用多次来向后移动多个字符。

  • echo "\r";将光标返回到当前行的开头。您现在可以用新文本替换该行。

  • 第三个选项是使用 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 适用于...

  • Perl
  • 红宝石
  • 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 回答