我想知道:如何在基于UNIX的系统上清理屏幕?我在互联网上搜索了一下,但我刚刚找到了如何在Windows:system("CLS")上做到这一点我不想完全清理屏幕,但我想打开一个"新页面",比如在NANO和VI编辑器中。感谢
也许您可以使用转义码
#include <stdio.h>
#define clear() printf(" 33[H 33[J")
int main(void)
{
clear();
return 0;
}
但请记住,这种方法并不适用于所有终端
您可以使用以下代码,这些代码使用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);
}
#include <stdlib.h>
int main(void)
{
system("clear");
}
可移植的UNIX代码应该使用terminfo数据库进行所有光标和屏幕操作。这就是像curses
这样的库用来实现窗口化等效果的方法。
terminfo数据库维护一个功能列表(比如clear
,它是您用来清除屏幕并将光标发送到顶部的)。它为广泛的设备维护了这样的功能,因此您不必担心您使用的是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来获得您想要的任何功能,尽管这可能会为清除屏幕这样简单的事情拖进很多东西。尽管如此,这还是一个需要认真考虑的选择,因为它给了你更多的灵活性。
这通常不是清除屏幕的问题,而是制作一个终端感知应用程序的问题。
您应该使用ncurses库并阅读ncurses编程HowTo
(你可能会像David RF回答的那样使用一些ANSI转义码,但我认为这不是一个好主意)
您可以使用CSI序列来实现这一点:
#include <stdio.h>
int main()
{
printf("x1b[Hx1b[J");
}
什么是x1b[H
实际上,它与x1b[1;1;H
相同,意味着它将把光标移动到第1行和第1列。
什么是x1b[J
又称x1b[0;J
若n为0或缺失,它将从光标到屏幕末尾清除。
来源:https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_sequences
只需在#include<stdio.h>
之后使用#include<stdlib.h>
。
然后可以在main() {
之后使用命令system("clear");
即:
#include<stdio.h>
#include<stdlib.h>
int main()
{
system("clear");
完成这些命令后,您可以继续执行程序。
希望这有帮助:)
要使用termcaps清除屏幕,请使用以下命令:
write(1, tgetstr("cl", 0), strlen(tgetstr("cl", 0)));
将system("clear");
与标头#include <stdlib.h>
(对于C语言)或#include <cstdlib>
(对于C++)一起使用。
此代码用于清除屏幕,并在终端风格窗口中重置滚动条位置
#include <iostream>
int main(){
std::cout << "