Как установить положение курсора консоли для стандартного вывода

Я хочу установить позицию курсора для печати char на экране консоли. Есть ли решение без использования ncurses библиотека.

Есть ли эквивалентный вызов для SetConsoleCursorPosition в линуксе из пример ниже:

void print (int x, int y, char c) {
COORD p = { x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), p);
printf("%c", c);
}

2

Решение

Возможно, немного истории в порядке. То, что вы называете «консолью» в Windows, на самом деле является примером эмулятора терминала; однако, в отличие от традиционных эмуляторов терминала, Windows обеспечивает прямой доступ к терминалу через консольный API. Традиционный подход, используемый терминалами (и, следовательно, эмуляторами терминалов), заключался в интерпретации escape-последовательности, каждый из которых инструктирует терминал выполнить некоторую операцию.

К сожалению, как вы можете себе представить, возможности терминалов сильно различались (некоторые могли даже рисовать графику того или иного вида), и поэтому не все терминалы используют один и тот же набор escape-последовательностей. В эти дни вам очень не повезло бы столкнуться с чем-то, что не реализовывало бы надмножество ANSI / VT100 убегает; если вы рады, что поддерживает только ANSI / VT100 и производные, вы можете отправить ESC [ n ; m H, где N номер строки и м номер столбца.

Однако если вы делать сделать это, ваш код не будет работать, если он представлен с чем-то экзотическим. В этом случае вам действительно стоит подумать об использовании библиотеки curses (ncurses — распространенный, но не единственный пример), даже если вы используете ее только для извлечения информации из базы данных terminfo (хотя я настоятельно рекомендую просто использовать curses библиотека).

Наконец, примечание: код, который вы цитируете из Windows, не обязательно будет работать (!) Почему? Так как printf() выполняет буферизованный вывод, и нет никакой гарантии, что ваш персонаж будет отправлен на консоль, прежде чем вы снова измените положение курсора. Вы можете исправить это, используя fflush(stdout), но если честно, если вы используете SetConsoleCursorPosition Вы также можете просто использовать WriteConsole и покончим с этим.

Дополнительная полезная информация

Вы можете получить версию проклятий, которая работает в Windows; см. например PDCurses. Если бы вы использовали проклятия, вам бы не понадобился какой-либо специфичный для Windows код, а также Вы будете работать на любом терминале, который использовался.

7

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector