Как я могу напечатать строку на консоли в определенных координатах на С++?

Я пытаюсь напечатать символы в консоли с указанными координатами. До сих пор я использовал очень уродливый printf("\033[%d;%dH%s\n", 2, 2, "str"); Но мне просто нужно было спросить, имел ли С++ какой-либо другой способ сделать это. Проблема не в том, что это уродливо, проблема возникает, когда я пытаюсь сделать себе более красивую функцию:

void printToCoordinates(int x, int y, string text)
{
 printf("\033[%d;%dH%s\n", x, x, text);
}

Это не работает, даже если я прибегаю к (char*). Другая проблема заключается в том, что я должен распечатать \n для обновления страницы... Мне просто не нравится использовать printf вообще.

Аналогично использованию cout вместо printf, я считаю, что должен быть более свежий способ сделать это (в идеале это позволяет мне легко писать строки, где я хочу на экране, и в идеале не требует этих странных символов: \033[%d;%dH)

Итак, у кого-нибудь из вас есть то, что я ищу?

7 ответов

То, что вы делаете, это использование некоторых очень специфичных для терминала символов волшебства в другом чистом С++ приложении. Хотя это работает, вам, вероятно, будет гораздо проще использовать библиотеку, которая абстрагирует вас от необходимости иметь дело с подробными сведениями о конкретных терминах терминала и предоставляет функции, которые делают то, что вам нужно.

Изучите, доступны ли библиотеки curses или ncurses для вашей системы.


Curses - это то, что вы ищете.


Я помню, используя gotoxy(x,y) в Turbo С++ (conio.h) - не знаю, будет ли это работать для вас, Он перемещает курсор в координаты, заданные x и y.

EDIT: Если вы используете Windows, здесь gotoxy clone: ​​

#include <windows.h>
void gotoxy(int x, int y)
{
 COORD coord;
 coord.X = x;
 coord.Y = y;
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
</windows.h>


Сначала:

void printToCoordinates(int x, int y, string text)
{
 printf("\033[%d;%dH%s\n", x, x, text);
}

Вы не хотите копировать строковый аргумент, вы хотите передать его ссылкой (const). Кроме того, (только) правильный способ получить char* из std::string - вызвать его функцию-член c_str():

void printToCoordinates(int x, int y, const std::string& text)
{
 printf("\033[%d;%dH%s\n", x, x, text.c_str());
}

Что касается вашего вопроса: С++ не имеет возможности делать то, что вы хотите, но он позволяет вам использовать определенные для платформы способы сделать это. Вы должны сказать нам свою платформу, чтобы получить содержательные ответы.


Несколько улучшений вашей функции:

void printToCoordinates(int x, int y, const char *format, ...)
{
 va_list args;
 va_start(args, format);
 printf("\033[%d;%dH", x, y);
 vprintf(format, args);
 va_end(args);
 fflush(stdout);
}

Эта версия:

  • позволяет использовать любые произвольные строки формата и переменных аргументов
  • автоматически сбрасывает stdout без печати новой строки
  • использует x и y в строке формата (использование x и x может быть опечаткой)

Однако, поскольку varargs по существу является функцией C и на самом деле не понимает объекты С++, вы должны называть его следующим образом:

printToCoordinates(10, 10, "%s", text.c_str());

Лучшим вариантом является использование curses (для Unix-подобных платформ) или функций консоли Win32 (для Windows), как указано в других ответах.


void screenpos(int x,int y,char textyowanawrite[20])
{
//printf for right shift
// \n for downward shift
//loops through the rows and shifts down 
for(int row=0;row<=y;row++)
{
printf("\n");
for (int i = 0; i < x; i++)
{
printf("%s "," " );
}
}
printf("%s ",textyowanawrite );
}

//Это должно сработать над определенной вымершей проблемой, не  где-то вроде 4,4 до 2,2, что проблема


У меня есть немного другой метод. Не уверен, что это лучше, чем пакет ncurses, поэтому я оставляю это для того, чтобы вы могли решить.

Вы можете использовать пакет Графика на С++ для вывода текста на определенную координату на рабочем экране. Синтаксис outtextxy(x, y, text) ; Где x и y - координаты.

Один пример:

int main(void) {
 int gdriver = DETECT, gmode;
    int x = 200, y = 200;
  
    initgraph(&gdriver, &gmode, "c:\\tc\\bgi");
  
    outtextxy(x, y, "Hello World");
    closegraph();
 }

Эта небольшая программа напечатает Hello World в координате (200 200).

Для справки о том, какой графический пакет можно сделать, посетите эту ссылку

licensed under cc by-sa 3.0 with attribution.