Использование команды "CLS" в C вызывает мерцание экрана

Я пытаюсь очистить консоль каждый раз, когда я собираюсь printf что-то в этом (среда Windows с компилятором GCC). Я использую CygWin, и единственный способ, которым я смог сделать это, был с system("cmd /c cls");, Это работает нормально, но заставляет экран мигать в течение доли секунды, что явно раздражает.

Есть ли альтернативный способ очистки экрана консоли?

2 ответа

Решение

Первое, что я хотел бы сделать, это перестать использовать cmd сделать это. CygWin, предполагая, что вы работаете где-то внутри оболочки, а не консоли Windows, имеет "нативную" опцию, в которой вы можете использовать любой из:

clear
tput clear

очистить экран, не вызывая внешний cmd переводчик.

Итак, из программы, запущенной в CygWin, вы можете очистить экран с помощью простого:

system("clear");

Конечно, если вы не хотите запускать внешние исполняемые файлы, вы можете достичь той же цели с помощью curses, В качестве примера, следующая программа очищает экран для вас (убедитесь, что вы включаете -lcurses в конце команды компиляции):

#include <curses.h>

int main (void) {
    WINDOW *w = initscr();
    clear(); refresh(); sleep(2);
    endwin();
    return 0;
}

Не зацикливайтесь на том факте, что он восстанавливается при выходе, вы не будете использовать эту программу как средство для очистки экрана. Вместо этого заявления будут включены в вашу собственную программу, между initscr() а также endwin() звонки, что-то вроде:

#include <curses.h>

int main (void) {
    char buf[2],
         *msg = "Now is the time for all good men to come to lunch.";
    WINDOW *w = initscr();

    buf[1] = '\0';
    clear();
    refresh();
    while (*msg != '\0') {
        buf[0] = *msg++; addstr(buf);
        if ((buf[0] == ' ') || (buf[0] == '.')) {
            refresh();
            sleep(1);
        }
    }

    endwin();
    return 0;
}

Эта программа очищает экран с помощью curses затем выводит сообщение кусками размером в слово.

Эта веб-страница:

http://man7.org/linux/man-pages/man4/console_codes.4.html

содержит общие последовательности ESC для обработки экрана терминала / положения курсора и т. д.

эта часть связанной информации, вероятно, то, что вы хотите реализовать.

Эти escape-последовательности могут быть помещены в начало буфера, который вы используете для вывода ваших данных / текста

Особый интерес представляет ESC [ 2 j: который стирает весь экран

J   ED        Erase display (default: from cursor to end of display).
                 ESC [ 1 J: erase from start to cursor.
                 ESC [ 2 J: erase whole display.
                 ESC [ 3 J: erase whole display including scroll-back
                            buffer (since Linux 3.0).
Другие вопросы по тегам