在C ++ unix中清除终端屏幕的一部分?

时间:2011-07-08 13:59:22

标签: c++ unix window terminal clear

我想将东西输出到终端窗口,然后只清除它的一部分(如上半部分或四分之一等)而不是其余部分。有没有办法可以做到这一点?我正在使用系统(“清除”),但这清除了一切。我宁愿不使用ncurses。任何帮助表示赞赏。

3 个答案:

答案 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转义序列可分别从光标和上/下清除到屏幕的顶部/底部。

请参阅http://www.termsys.demon.co.uk/vtansi.htm