在UNIX中输出退格字符

Output backspace character in UNIX

本文关键字:字符 输出 UNIX      更新时间:2023-10-16

我正在尝试为加载条添加动画。

在Windows中执行以下操作可以完全正常工作:

    for(int j=0; j<currentSize; ++j)
      cout<<static_cast<char>(219);
    for(int k=maxSize; k>=currentSize; k--)
      cout<<static_cast<char>(177);
    ...
    for(int l = 0; l<maxBarSize; l++){
      cout<<'b';

但是,当我在UNIX中尝试时,退格命令不起作用。它不会删除或打印任何东西。我也试过用'^H'代替'b'

在UNIX中不可能擦除输出控制台行吗?

您试过打印[backspace], [space], [backspace]吗?这将在你要删除的字符上方打印一个空格。

如果这不起作用,我怀疑问题不在于你的代码,而在于你的终端模拟器(xterm等)有些支持退格,有些不支持,(有些是可配置的)。

同时,Elazar发表了关于调用cout.flush()的评论。这是因为大多数情况下,stdout是行缓冲的。这意味着库将缓冲所有写入stdout的数据,直到遇到换行符,此时缓冲区将刷新到实际的文件描述符。通过调用flush(),可以强制将输出缓冲区立即写入文件(TTY)。

打印b^h就是这样做的:它将"打印"这些字符。它不执行"回删"操作,而TTY程序在响应键盘输入时会执行"回删"操作。您不会在输出中看到它们,因为它们不是可见字符。它们改变光标的位置。如果你打印:

Hello, World!bbbbbbEarth!

如果您将输出发送到文件,您将看到所有这些字符。但是在终端上,它可能看起来像:

Hello, Earth!

"World!"字符还在,只是被"Earth!"