在基于UNIX的系统上清除C和C ++中的屏幕?

时间:2013-06-24 08:57:24

标签: c unix screen cls

我想知道:如何在基于UNIX的系统上清理屏幕?我在互联网上搜索,但我刚刚在Windows上找到了如何做到这一点:system(“CLS”) 我不想完全清理屏幕,但我想打开一个“新页面”,例如在NANO和VI编辑器中。感谢

10 个答案:

答案 0 :(得分:21)

也许您可以使用转义码

#include <stdio.h>

#define clear() printf("\033[H\033[J")

int main(void)
{
    clear();
    return 0;
}

但请记住,此方法与所有终端不兼容

答案 1 :(得分:15)

您可以使用以下代码将termcap用于清除屏幕。 (别忘了与图书馆联系)

#include <stdio.h>
#include <stdlib.h>
#include <termcap.h>

void clear_screen()
{
char buf[1024];
char *str;

tgetent(buf, getenv("TERM"));
str = tgetstr("cl", NULL);
fputs(str, stdout);
} 

答案 2 :(得分:4)

便携式UNIX代码应该使用terminfo数据库进行所有光标和屏幕操作。这就像curses这样的库用来实现窗口等效果。

terminfo数据库维护一个capabailities列表(如clear,您可以使用它来清除屏幕并将光标发送到顶部)。它为 wide 系列设备维护此类功能,因此您无需担心是使用Linux控制台还是使用(非常过时的)VT52终端。

关于如何获取某些操作的字符流,您可以选择仅使用system来实现它的历史悠久而又相当可怕的方法:

system ("tput clear");

或者您可以将该命令的输出捕获到缓冲区,以便稍后使用仅涉及输出字符而不是重新运行命令:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

static char scrTxtCls[20]; static size_t scrSzCls;

// Do this once.

FILE *fp = popen ("tput clear", "r");
scrSzCls = fread (scrTxtCls, 1, sizeof(scrTxtCls), fp);
pclose (fp);
if (scrSzCls == sizeof(scrTxtCls)) {
    actIntelligently ("you may want to increase buffer size");
}

// Do this whenever you want to clear the screen.

write (1, cls, clssz);

或者,您可以与ncurses链接并使用其API来获取您想要的任何功能,尽管这可能会拖拽相当多的内容,只需清除屏幕即可。不过,这是一个值得认真考虑的选择,因为它可以给你更大的灵活性。

答案 3 :(得分:3)

通常不仅仅是清除屏幕,而是制作终端感知应用程序。

您应该使用ncurses库并阅读NCURSES programming HowTo

(您可以使用ANSI escape codes作为David RF回答,但我认为这不是一个好主意)

答案 4 :(得分:3)

#include <stdlib.h>
int main(void)
{
    system("clear");
}

答案 5 :(得分:0)

要使用termcaps清除屏幕,请使用:

write(1, tgetstr("cl", 0), strlen(tgetstr("cl", 0)));

答案 6 :(得分:0)

#include<stdlib.h>之后使用#include<stdio.h>

然后您可以在system("clear");

之后使用main() {命令

即:

#include<stdio.h>
#include<stdlib.h>

int main()
{
    system("clear");

完成这些命令后,您可以继续学习该程序。

希望这会有所帮助:)

答案 7 :(得分:0)

system("clear");与标题#include <stdlib.h>(对于C语言)或#include <cstdlib>(对于C ++)一起使用。

答案 8 :(得分:0)

您可以使用CSI序列实现此目的:

#include <stdio.h>
int main()
{
    printf("\x1b[H\x1b[J");
}

\x1b[H是什么?

实际上它与\x1b[1;1;H相同,这意味着它会将光标移动到第1行和第1列。

\x1b[J a.k.a \x1b[0;J是什么?

如果n为0或缺失,它将从光标到屏幕的末尾清除。

来源:https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_sequences

答案 9 :(得分:0)

此代码用于清除带有终端样式窗口中滚动条位置的清晰屏幕 #include <iostream> int main(){ std::cout << "\033c"; return 0;}

相关问题