2009-11-03 15 views
5

J'essaie d'imprimer des caractères dans la console aux coordonnées spécifiées. Jusqu'à présent, j'ai utilisé le très moche printf("\033[%d;%dH%s\n", 2, 2, "str"); Mais je devais juste demander si C++ avait une autre façon de le faire. Le problème est même pas qu'il est laid, le problème se pose lorsque je tente de me faire une fonction plus jolie comme ceci:Comment puis-je imprimer une chaîne sur la console à des coordonnées spécifiques en C++?

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

Il ne fonctionne pas, même si je Typecast à (char*). Un autre problème est que je dois imprimer le \n pour la page à rafraîchir ... Je n'aime pas utiliser printf en général. De même que pour l'utilisation de cout au lieu de printf, je crois qu'il devrait y avoir une manière plus récente de le faire (idéalement une façon qui me permet d'écrire facilement des chaînes où je veux sur l'écran, et idéalement une façon qui ne le fait pas requis ces symboles étranges: \033[%d;%dH)

Alors, est-ce que l'un de vous a ce que je cherche?

+1

Quelle plate-forme travaillez-vous? – Jacob

+0

Ubuntu 9.04, J'utilise g ++ pour compiler – Shawn

Répondre

5

Ce que vous faites utilise des caractères magiques spécifiques très spécifiques dans une application C++ pure. Bien que cela fonctionne, vous aurez probablement beaucoup plus de facilité à utiliser une bibliothèque qui vous évite d'avoir à traiter des détails d'implémentation spécifiques au terminal et qui fournit des fonctions qui répondent à vos besoins.

Recherchez si des bibliothèques curses ou ncurses sont disponibles pour votre système.

11

Curses est ce que vous cherchez.

+2

Ou les nouveaux nCurses veriant. –

+0

Je ne trouve pas ce qu'il faut inclure pour avoir accès aux sorts. Je ne peux pas non plus trouver de documentation pour l'API .. – Shawn

+1

@Shawn: 'man ncurses' vous aurait dit' ' – MSalters

2

Quelques améliorations à votre fonction:

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

Cette version:

  • vous permet d'utiliser une liste chaîne de format arbitraire et variable d'arguments
  • vide automatiquement stdout sans l'impression d'une nouvelle ligne
  • utilise x et y dans la chaîne de format (votre utilisation de x et x peut-être une faute de frappe)

Cependant, parce que varargs est essentiellement une fonction et ne comprend pas vraiment des objets C++, il vous faudrait l'appeler comme C ceci:

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

Une meilleure option est vraiment d'utiliser des malédictions (pour les plates-formes de type Unix) ou des fonctions de la console Win32 (pour Windows) comme mentionné dans d'autres réponses.

+0

qu'est-ce que le fflush (stdout); partie faire? – Shawn

+0

Normalement, stdout est "tamponné", ce qui signifie que la bibliothèque d'exécution C met en file d'attente ce que vous imprimez et l'envoie uniquement à la console lorsque: a) vous générez un retour à la ligne, (b) fichier. Utiliser 'fflush()' dans ce cas est plus simple et plus évident que d'imprimer une nouvelle ligne (et cela empêchera les problèmes de défilement si vous essayez d'imprimer des choses sur la dernière ligne de l'écran). –

8

Je me souviens d'utiliser gotoxy(x,y) dans Turbo C++ (conio.h) - je ne sais pas si ça va marcher pour vous. Il déplace le curseur aux coordonnées spécifiées par x et y.

EDIT: Si vous utilisez Windows, voici un clone 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' a un espace dedans. Assurez-vous de l'enlever. – Aistis

3

Première:

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

Vous ne voulez pas copier l'argument de chaîne, vous voulez le transmettre par (const) référence. En outre, le (seulement) bonne façon d'obtenir un char* d'un std::string est d'appeler sa fonction de membre c_str():

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

Quant à votre question: C++ n'a aucun moyen de faire ce que vous voulez, mais il vous permet de utiliser des moyens spécifiques à la plateforme pour le faire. Vous devez nous indiquer votre plate-forme afin d'obtenir des réponses significatives.

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

// cela devrait fonctionner à certains problèmes que disparu est u ne peux pas aller de quelque part comme 4,4 à 2,2 thats le problème

-1

J'ai un peu autre méthode. Je ne sais pas si c'est mieux que le paquet ncurses, donc je laisse ça aux décisionnaires.

Vous pouvez utiliser Graphics package en C++ pour afficher un texte à une coordonnée spécifique sur votre écran de travail. La syntaxe est outtextxy(x, y, text) ; Où x & y sont des coordonnées.

Un exemple est:

int main(void) { 

    int gdriver = DETECT, gmode; 

   int x = 200, y = 200; 

  

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

  

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

   closegraph(); 

} 

Ce petit programme imprimera Bonjour tout le monde dans les coordonnées (200200).

Pour référence à ce logiciel graphique peut punirai this link

+0

Le paquet graphique est non standard, et probablement indisponible sur Ubuntu, la plateforme de l'OP –