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

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

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)

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


person Shawn    schedule 03.11.2009    source источник
comment
На какой платформе вы работаете?   -  person Jacob    schedule 04.11.2009
comment
Ubuntu 9.04, я использую g++ для компиляции   -  person Shawn    schedule 04.11.2009


Ответы (7)


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

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

person CB Bailey    schedule 03.11.2009

Проклятия — это то, что вам нужно.

person Dima    schedule 03.11.2009
comment
Я не могу найти, что включить, чтобы иметь доступ к проклятиям. Я также не могу найти документацию для API. - person Shawn; 04.11.2009

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

EDIT: Если вы используете Windows, вот клон gotoxy:

#include <windows.h>

void gotoxy(int x, int y)
{
  COORD coord;
  coord.X = x;
  coord.Y = y;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
person Jacob    schedule 03.11.2009
comment
STD_OUTPUT_HANDLE есть пробел. Обязательно удалите его. - person Aistis; 26.12.2016

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

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 и на самом деле не понимает объекты C++, вам придется вызывать ее следующим образом:

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

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

person Greg Hewgill    schedule 03.11.2009
comment
что делает fflush(stdout); часть делать? - person Shawn; 04.11.2009
comment
Обычно стандартный вывод буферизуется, что означает, что библиотека времени выполнения C ставит в очередь то, что вы печатаете, и отправляет его на консоль только тогда, когда (а) вы выводите новую строку, (б) очередь заполняется или (в) вы вручную очищаете файл. Использование fflush() в этом случае более просто и очевидно, чем печать новой строки (и это предотвратит проблемы с прокруткой, если вы пытаетесь напечатать что-то в нижней строке экрана). - person Greg Hewgill; 04.11.2009

Первый:

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());
}

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

person sbi    schedule 03.11.2009
comment
Должен быть printf(...., x, y, text); не printf(...,x,x,text) .. выше редактировать нельзя. - person mosh; 16.06.2020

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, вот в чем проблема

person shrinjoy biswas    schedule 17.01.2018

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

Вы можете использовать пакет Graphics в C++ для вывода текста в определенную координату на рабочем экране. Синтаксис: 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).

Чтобы узнать, что может делать графический пакет, посетите эту ссылку

person Reaganrewop    schedule 17.01.2018
comment
Графический пакет нестандартен и, вероятно, недоступен в Ubuntu, платформе OP. - person Basile Starynkevitch; 17.01.2018