Управление курсором при отображении вывода программы на C в Linux - PullRequest
1 голос
/ 21 сентября 2010

Я пишу программу на C, которая должна выполняться на терминале Linux.Программа входит в бесконечный цикл и печатает пять строк снова и снова.Как вернуть курсор на предыдущие строки?

Например, я хочу напечатать алфавиты и заменять их каждые 15 секунд.Таким образом, при T = 0 вывод равен

sh>./a.out
AA
BB
CC
DD
EE

При T = 15 вывод равен

sh>./a.out
FF
GG
HH
II
JJ

Я попытался использовать lseek over STDOUT, чтобы перезаписать предыдущий текст.Но я думаю, что терминал не поддерживает lseek.Нужно ли возиться с драйверами API?Или есть более простой способ сделать это?

Ответы [ 4 ]

2 голосов
/ 21 сентября 2010

Вам нужна библиотека curses, такая как ncurses .

2 голосов
/ 21 сентября 2010
1 голос
/ 21 сентября 2010

Работая в терминале Linux, вы должны иметь возможность использовать символ '\ r', который является переводом каретки (без новой строки). Он перезапишет то, что было раньше.

Попробуйте что-то вроде:

#include <stdio.h>

int main(void)
{
    printf("AA BB CC");
    fflush(stdout);
    sleep(3);
    printf("\rDD EE FF");
    fflush(stdout);
    sleep(3);
    printf("\n");

    return 0;
}

С этим вы сможете делать все, что захотите в цикле ...

Редактировать ... используя ncurses:

#include <stdio.h>
#include <ncurses.h>

int main(void)
{

    initscr();
    noecho();
    raw();

    printw("AA\nBB\nCC\n");
    refresh();
    sleep(3);
    mvwprintw(stdscr, 0, 0, "DD\nEE\nFF\n");
    refresh();
    sleep(3);

    endwin();

    return 0;
}
1 голос
/ 21 сентября 2010

Нет простого способа сделать то, что вы хотите.Думайте о stdout как о непрерывном листе бумаги, который невозможно оторвать назад.Как только вы напечатаете строку, это все.Больше никаких изменений в этой строке нет.

Вы можете "преобразовать стандартный вывод" в принтер другого типа, используя специальные библиотеки (curses распространено), не определенные Стандартом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...