【问题标题】:How to type a backspace in C++?如何在 C++ 中键入退格键?
【发布时间】:2020-09-08 03:30:23
【问题描述】:

我正在编写一个使用循环的程序需要一段时间。我正在输出进度,但目前正在一个接一个地打印很多东西,例如:

1% 2% 3% 等等……

我想有这个输出,并试图通过使用退格删除已经打印到屏幕上的内容并用其他内容替换它来实现。我想我可以使用 '\b' 控制字符来这样做,但它似乎不起作用。 pop_back() 也不起作用,因为我正在使用双精度。

如何删除打印到屏幕上的内容?

我在 MacBook Pro 上使用 Xcode。

想象一下我的最终代码可能是什么样子的一个例子是:

#include <iostream>
...
...


int main(){

  for(;;){

      double SomeDoubleValue = 1234;//this is value I want to display in place

      /*code that deletes whatever is printed to screen here*/

      cout << SomeDoubleValue << "%"; //Displaying my value as progress percentage;


    }

}

除了使用 '\b' 还有其他方法吗?

【问题讨论】:

标签: c++


【解决方案1】:

使用\b 应该可以,但我通常发现使用\r 更容易、更方便:

for (int i=0; i<100; i++)
    std::cout << '\r' << i/100.0 << std::flush;

但请注意:如果后面的输出比以前的更窄,这不会(自动)覆盖较大的部分。例如,如果你修改前面的循环,在最后写出1

for (int i=0; i<101; i++)
    std::cout << '\r' << i/100.0 << std::flush;

...1 将被写入小数点后没有任何内容,只会覆盖前一个0.99 开头的0,因此最终显示为1.99而不是1.00。为了防止这种情况,您可以(对于一种可能性)设置固定格式,以及指定的精度和宽度:

for (int i=0; i<101; i++)
    std::cout << '\r' << std::fixed << std::setw(3) << std::setprecision(2) << i/100.0 << std::flush;

(是的,即使经过这么多年,这种语法的冗长仍然让我有些困扰;我期待std::format)。

当然,如果您要打印递增整数,则不会遇到这个特殊问题。

【讨论】:

  • 这对我不起作用。它仍然连续打印并且不删除任何内容。
  • @BogdanLinchuk:我想这并不奇怪。 MacOS (\r 作为它的行尾字符,而且他们显然已经打破了他们当前的外壳来做同样的事情。几乎是解决此问题的唯一合理方法是将 Apple 损坏的终端仿真器替换为未损坏的终端仿真器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-25
  • 1970-01-01
相关资源
最近更新 更多