2009-11-03 44 views
5

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 ni siquiera que es feo, el problema surge cuando intento hacerme una función más bonita de esta manera:¿Cómo puedo imprimir una cadena a la consola en coordenadas específicas en C++?

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

No funciona, incluso si encasillado a (char*). Otro problema es que tengo que imprimir el \n para la página que se actualizará ... Simplemente no me gusta usar printf en general.

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

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

+1

¿En qué plataforma estás trabajando? – Jacob

+0

Ubuntu 9.04, estoy usando g ++ para compilar – Shawn

Respuesta

5

Lo que estás haciendo es usar algunos caracteres mágicos específicos muy terminales en una aplicación de C++ por lo demás pura. Mientras esto funcione, probablemente le resultará mucho más fácil usar una biblioteca que lo reste de tener que lidiar con detalles de implementación específicos de la terminal y proporcione funciones que hagan lo que necesita.

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

11

Curses es lo que estás buscando.

+2

O el nuevo veriant nCurses. –

+0

No puedo encontrar qué incluir para tener acceso a las maldiciones. Tampoco puedo encontrar ninguna documentación para la API .. – Shawn

+1

@Shawn: 'man ncurses' te habría dicho' ' – MSalters

2

Unas mejoras a 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 utilizar cualquier cadena de formato arbitrario y listas de argumentos variables
  • vuelca automáticamente stdout sin imprimir un carácter de nueva línea
  • utiliza x y y en el formato de cadena (su uso de x y x puede haber sido un error tipográfico)

Sin embargo, debido varargs es esencialmente una función de C y realmente no entiendo objetos C++, habría que llamarlo así:

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

Una mejor opción es utilizar maldiciones (para plataformas tipo Unix) o funciones de consola Win32 (para Windows) como se menciona en otras respuestas.

+0

¿Qué hace el fflush (stdout); parte hacer? – Shawn

+0

Normalmente, stdout está "almacenado en el búfer", lo que significa que la biblioteca de tiempo de ejecución de C pone en cola lo que imprime y solo lo envía a la consola cuando (a) muestra una nueva línea, (b) la cola se llena o (c) vacía manualmente archivo. Usar 'fflush()' en este caso es más sencillo y obvio que imprimir una nueva línea (y evitará problemas de desplazamiento si está tratando de imprimir cosas en la línea inferior de la pantalla). –

8

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

EDIT: Si se está utilizando Windows, aquí es 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); 
} 
+0

'STD_OUTPUT_HANDLE' tiene un espacio en él. Asegúrate de eliminarlo. – Aistis

3

Primero:

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

Usted no desea copiar el argumento de cadena, que desea pasarlo por (const) referencia. Además, el (único) camino correcto para conseguir un char* de un std::string es llamar a su función c_str() miembro de:

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

cuanto a su pregunta: C++ no tiene manera de hacer lo que quiera, pero le permite use formas específicas de plataforma para hacerlo. Tendría que decirnos su plataforma para obtener respuestas significativas.

0
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 a cierta único problema es extinguido u no puede ir de un lugar como 4,4 a 2,2 ése es el problema

-1

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

Puede usar el paquete Graphics 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).

Por referencia a lo que pueden hacer paquete de gráficos visitar this link

+0

El paquete de gráficos no es estándar, y probablemente no esté disponible en Ubuntu, la placa del OP –

Cuestiones relacionadas