Я хочу установить позицию курсора для печати char
на экране консоли. Есть ли решение без использования ncurses
библиотека.
Есть ли эквивалентный вызов для SetConsoleCursorPosition
в линуксе из пример ниже:
void print (int x, int y, char c) {
COORD p = { x, y };
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), p);
printf("%c", c);
}
Возможно, немного истории в порядке. То, что вы называете «консолью» в 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 код, а также Вы будете работать на любом терминале, который использовался.