我想将东西输出到终端窗口,然后只清除它的一部分(如上半部分或四分之一等)而不是其余部分。有没有办法可以做到这一点?我正在使用系统(“清除”),但这清除了一切。我宁愿不使用ncurses。任何帮助表示赞赏。
答案 0 :(得分:3)
如果您需要一般解决方案,那么它将以某种方式涉及返回终端,通过使用特殊字符,用空白覆盖您要删除的部分并恢复应该仍然可见的部分。
您可以在this帖子中了解如何返回终端。它包含一些示例,显示如何使用回车符(\ r)字符。
此外,还有一个示例,显示如何使用ansi转义序列来获取红色文本。以同样的方式,您可以使用ansi转义序列写入终端上的特定位置,看看here。此链接中的“强制光标位置”应该能够为每个位置写入空格,您想要清除。
但是您应该知道,并非所有终端都支持这些方法,如果您将输出流式传输到文件,它将包含这些特殊字符。
答案 1 :(得分:3)
如果你弄清楚终端的功能是什么,你可以简单地用cout将它们写到stdout。
如果您不确定从哪里开始,可以像这样进行试验:在提示符下键入man terminfo
,您可能会得到一个终端功能列表。尝试使用tput
来查看哪些有效。然后找出你需要打印的代码是什么:
% tput el | od -t x1
0000000 1b 5b 4b
0000003
将这些字节发送到我的终端会发出“clr_eol”(“el”),它会清除到行尾。弄清楚如何在终端上移动光标,如何清除线条,以及你已经完成了。
看到你正在使用gnome-terminal,你可以这样擦除前3行:将光标移动到home,擦除到行尾,向下移动,擦除到行尾,向下移动,擦除到结束线。
找出你需要打印的内容:
% ( tput home ; tput el ; tput cud1 ; tput el ; tput cud1 ; tput el ; tput cud1 ; tput el ; tput cud1 ; tput el ) | od -t x1
0000000 1b 5b 48 1b 5b 4b 0a 1b 5b 4b 0a 1b 5b 4b 0a 1b
0000020 5b 4b 0a 1b 5b 4b
0000026
将这些字节(1B 5B 48等)发送到stdout(使用cout)将从C ++中获取技巧。
使用ncurses会更便携,如果你不想使用它,你可能会发现你最终会重新实现它。
答案 2 :(得分:0)
有两个VT100转义序列可分别从光标和上/下清除到屏幕的顶部/底部。