Очистити екран в C і C ++ на основі UNIX-системи?

Я хочу знати: як очистити екран на основі UNIX? Я шукав в Інтернеті, але я тільки що знайшов, як це зробити на Windows: system ("CLS") Я не хочу точно очищати cpmpletely екран, але я хочу відкрити "нову сторінку", наприклад, у редакторах NANO і VI. Дякую

10
vi та nano використовують буфери для збереження текстових даних. Вам потрібно реалізувати такий буфер і механізм прокручування.
додано Автор bash.d, джерело
printf ("e [2J e [H");
додано Автор Hello World, джерело

14 Відповіді

Можливо, ви можете використовувати коди евакуації

#include 

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

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

Але майте на увазі, що цей метод не сумісний з усіма терміналами

16
додано
Ви можете розробити "033 [H 033 [J")
додано Автор krupal, джерело

Ви можете використовувати наступний код, який використовує termcap для очищення екрану. (не забудьте зв'язати з бібліотекою)

#include 
#include 
#include 

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

tgetent(buf, getenv("TERM"));
str = tgetstr("cl", NULL);
fputs(str, stdout);
} 
15
додано
+1, на Debian потрібно встановити libncurses5-dev і скомпілювати за допомогою -lncurses
додано Автор Keine Lust, джерело

Портативний код UNIX повинен використовувати базу даних terminfo для всіх маніпуляцій з курсором і екраном. Саме такі бібліотеки, як curses , використовують для досягнення своїх ефектів, таких як вікно та ін.

База даних terminfo зберігає список можливостей (наприклад, clear , який ви використовуєте, щоб очистити екран і надіслати курсор на верх). Він підтримує такі можливості для широкого діапазону пристроїв, так що вам не доведеться турбуватися про те, чи використовуєте консоль Linux або (дуже датований) термінал VT52.

Що стосується того, як ви отримаєте потоки символів для певних операцій, ви можете обрати час, але скоріше жахливий спосіб просто використовувати system для цього:

system ("tput clear");

Або ви можете захопити вивід цієї команди в буфер, щоб пізніше використовувати лише виведення символів, а не повторне виконання команди:

#include 
#include 
#include 

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, щоб отримати будь-які можливості, які ви хочете, хоча це може перетягнути досить багато матеріалу для чогось простого, як очищення екрану. Тим не менш, це можливість розглядати серйозно, оскільки вона дає вам набагато більше гнучкості.

4
додано

Як правило, це не питання просто очищення екрану, а створення додатків, що мають свідомість.

You should use the ncurses library and read the NCURSES programming HowTo

//stackoverflow.com/a/17271636/841108">David RF відповів, але я не думаю, що це гарна ідея)

3
додано
#include 
int main(void)
{
    system("clear");
}
2
додано
#include 
int main(void)
{
    system("clear");
}
2
додано

Щоб очистити екран за допомогою termcaps, використовуйте це:

write(1, tgetstr("cl", 0), strlen(tgetstr("cl", 0)));
0
додано

Щоб очистити екран за допомогою termcaps, використовуйте це:

write(1, tgetstr("cl", 0), strlen(tgetstr("cl", 0)));
0
додано

Use system("clear"); with header #include (for C Language) or #include (for C++).

0
додано

Use system("clear"); with header #include (for C Language) or #include (for C++).

0
додано

Just use #include after #include.

Then you can use the command system("clear");after main() {

тобто:

#include
#include

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

Після цих команд ви можете продовжити програму.

Сподіваюся, що це допоможе :)

0
додано

Just use #include after #include.

Then you can use the command system("clear");after main() {

тобто:

#include
#include

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

Після цих команд ви можете продовжити програму.

Сподіваюся, що це допоможе :)

0
додано

Цього можна досягти за допомогою послідовностей CSI:

#include 
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 або відсутній, воно буде очищено від курсора до кінця екрана.

Source: https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_sequences

0
додано

Цього можна досягти за допомогою послідовностей CSI:

#include 
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 або відсутній, воно буде очищено від курсора до кінця екрана.

Source: https://en.wikipedia.org/wiki/ANSI_escape_code#CSI_sequences

0
додано