【问题标题】:Output backspace character in UNIX在 UNIX 中输出退格字符
【发布时间】:2013-05-28 09:59:04
【问题描述】:

我正在尝试为加载栏设置动画。

通过执行以下操作,它在 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 中不能擦除输出控制台行吗?

【问题讨论】:

  • 试试cout.flush()。你也可以使用'\r'。请注意,退格不会清除任何内容 - 只会将光标向后移动。
  • 成功了,谢谢!

标签: c++ unix escaping unicode-escapes


【解决方案1】:

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

Hello, World!\b\b\b\b\b\bEarth!

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

Hello, Earth!

“世界!”字符仍然存在,只是被“地球!”覆盖

【讨论】:

    【解决方案2】:

    您是否尝试过打印[backspace][space][backspace]?这将在您要擦除的字符上方打印一个空格。

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

    麻生太郎,Elazar 发了comment 的关于打电话给cout.flush() 的问题。这是因为大多数时候,stdout行缓冲。这意味着库将缓冲所有写入stdout 的数据,直到遇到换行符,此时缓冲区被刷新到实际的文件描述符。通过调用flush(),您强制将输出缓冲区立即写入文件(TTY)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-01
      • 1970-01-01
      • 2020-02-06
      • 2013-05-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多