7 Pregunta: ¿Cómo puedo imprimir una cadena en la consola en coordenadas específicas en C ++?

pregunta creada en Tue, Nov 3, 2009 12:00 AM

Estoy tratando de imprimir caracteres en la consola en las coordenadas especificadas. Hasta ahora he estado usando el muy feo printf("\033[%d;%dH%s\n", 2, 2, "str"); Pero solo tenía que preguntar si C ++ tenía alguna otra forma de hacerlo. El problema no es que sea feo, el problema surge cuando intento hacerme una función más bonita como esa:

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

No funciona, incluso si escribo el número (char*). Otro problema es que tengo que imprimir el \n para que se actualice la página ... Simplemente no disfruto utilizando printf en general.

De forma similar al uso de cout en lugar de printf, creo que debería haber una forma más reciente de hacerlo (idealmente, una forma que me permita escribir fácilmente las cadenas que quiero en la pantalla, e idealmente una forma que no sea necesaria estos símbolos extraños: \033[%d;%dH)

Entonces, ¿alguno de ustedes tiene lo que estoy buscando?

    
7
  1. ¿En qué plataforma estás trabajando?
    2009-11-03 23: 49: 24Z
  2. Ubuntu 9.04, estoy usando g ++ para compilar
    2009-11-03 23: 58: 28Z
7 Respuestas                              7                         

Lo que estás haciendo es usar algunos caracteres mágicos muy específicos del terminal en una aplicación de C ++ que de otra forma sería pura. Si bien esto funciona, es probable que le resulte mucho más fácil usar una biblioteca que le resulte abstenerse de tener que lidiar con los detalles de implementación específicos de la terminal y que proporcione funciones que hagan lo que necesita.

Investigue si las bibliotecas de curses o ncurses están disponibles para tu sistema.

    
4
2009-11-03 23: 50: 18Z

Curses es lo que estás buscando.

    
12
2009-11-03 23: 48: 50Z
  1. O el nuevo veriant nCurses.
    2009-11-03 23: 56: 44Z
  2. No puedo encontrar qué incluir para tener acceso a las cursas. Tampoco puedo encontrar ninguna documentación para la API.
    2009-11-04 00: 01: 17Z
  3. @ Shawn: man ncurses te habría dicho <curses.h>
    2009-11-04 15: 56: 36Z
  4. maldita sea, nunca pienso en el hombre, gracias
    2009-11-05 22: 50: 17Z

Recuerdo usar gotoxy(x,y) en Turbo C ++ .h) - aunque no sé si funcionará para ti. Mueve el cursor a las coordenadas especificadas por x y y.

EDITAR: Si está utilizando Windows, aquí hay un clon gotoxy:

#include <windows.h>

void gotoxy(int x, int y)
{
  COORD coord;
  coord.X = x;
  coord.Y = y;
  SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
    
11
2017-09-24 17: 11: 47Z
  1. STD_OUTPUT_HANDLE tiene un espacio en él. Asegúrate de eliminarlo.
    2016-12-26 11: 26: 09Z

Primero:

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

No desea copiar el argumento de cadena, desea pasarlo por (const) de referencia. Además, la (solo) manera correcta de obtener un char* de un std::string es llamar a su c_str() función miembro:

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

En cuanto a tu pregunta: C ++ no tiene forma de hacer lo que quieres, pero te permite usar formas específicas de la plataforma para hacerlo. Tendría que decirnos su plataforma para obtener respuestas significativas.

    
4
2009-11-03 23: 53: 03Z

Algunas mejoras en su función:

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

Esta versión:

  • le permite usar cualquier cadena de formato arbitrario y listas de argumentos variables
  • se vacía automáticamente stdout sin imprimir una nueva línea
  • utiliza x y y en la cadena de formato (el uso de x y x puede haber sido un error)

Sin embargo, dado que varargs es esencialmente una función de C y no entiende realmente los objetos de C ++, tendrías que llamarlo así:

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

Una mejor opción es usar curses (para plataformas similares a Unix) o funciones de la consola Win32 (para Windows) como se menciona en otras respuestas.

    
4
2017-10-28 09: 15: 22Z
  1. lo que hace fflush (stdout); parte hacer?
    2009-11-03 23: 59: 26Z
  2. Normalmente stdout está "buffered", lo que significa que la biblioteca en tiempo de ejecución de C pone en cola lo que imprime y solo lo envía a la consola cuando (a) da salida a una nueva línea, (b ) la cola se llena, o (c) usted descarga manualmente el archivo. El uso de fflush() en este caso es más sencillo y obvio que imprimir una nueva línea (y evitará problemas de desplazamiento si está intentando imprimir material en la línea inferior de la pantalla).
    2009-11-04 00: 32: 47Z
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 );
} 

//esto debería funcionar para cierto problema extinto, del cual no puedes ir    En algún lugar como 4,4 a 2,2 ese es el problema

    
0
2018-01-17 04: 18: 58Z

Tengo un método un poco diferente. No estoy seguro de si esto es mejor que el paquete ncurses, así que lo dejo para que decidan los upvoters.

Puede usar el paquete Gráficos en C ++ para enviar un texto a una coordenada específica en su pantalla de trabajo. La sintaxis es outtextxy(x, y, text) ;. Donde x & y son coordenadas.

Un ejemplo es:

int main(void) {

    int gdriver = DETECT, gmode;

    int x = 200, y = 200;

  

    initgraph(&gdriver, &gmode, "c:\\tc\\bgi");

  

    outtextxy(x, y, "Hello World");

    closegraph();

 }

Este pequeño programa imprimirá Hello World en la coordenada (200,200).

Para consultar qué puede hacer el paquete de gráficos, visite este enlace

    
- 1
2018-01-17 05: 40: 02Z
  1. El paquete de gráficos no es estándar, y probablemente no esté disponible en Ubuntu, la plataforma de OP
    2018-01-17 05: 44: 04Z
fuente colocada aquí