如何在控制台应用程序(Linux)中删除打印的字符?
题
我正在创建一个需要进度条的小型控制台应用程序。就像是...
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 平台 - 但如果您有一个跨平台的解决方案,那就更好了。
解决方案
我认为你不需要为语言选择道歉。 PHP是控制台应用程序的一种很好的语言。
试试这个:
<?php
for( $i=0;$i<10;$i++){
print "$i \r";
sleep(1);
}
?>
<!>“; \ r <!>”;将使用新文本覆盖该行。要创建一个新行,您只需使用<!>“; \ n <!>”,但我猜你已经知道了。
希望这有帮助!我知道这适用于Linux,但我不知道它是否适用于Windows或其他操作系统。
其他提示
要删除以前打印的字符,您有以下三种选择:
echo chr(8) . " ";
回显后一个字符,并将光标移回一位,然后空格覆盖该字符。您可以使用chr(8)
连续多次可向后移动多个字符。echo "\r";
将使光标返回到当前行的开头。您现在可以用新文本替换该行。第三种选择是使用 ANSI 转义码设置光标位置的行和列,然后打印替换字符。它可能不适用于所有终端:
function movecursor($line, $column){
echo "\033[{$line};{$column}H";
}
成功了。
为了将来参考,\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",
我不确定它在Linux中是否相同但在Windows控制台应用程序中您可以打印\ r \ n并且光标将返回到该行的左侧第一个位置,允许您覆盖右侧的所有字符。
您可以使用\ b移回单个字符,但由于您要更新进度条\ r \ n比使用打印\ b x次更简单。
这似乎是一个相当古老的话题,但我会把我的5放进去。
for ($i; $i<_POSITION_; $i--) {
echo "\010"; //issue backspace
}
前一段时间在互联网上发现这个,遗憾的是不记得在哪里。因此,所有学分都归原作者所有。
要删除以前打印过的字符,请在其后打印退格: print <!>“a <!>”; print <!> quot; \ b <!> quot;
将打印 nothing (实际上它会打印然后退格,但你可能不会注意到它)