2009-11-03 7 views
5

Ich versuche, Zeichen in der Konsole an angegebenen Koordinaten zu drucken. Bis jetzt habe ich das sehr hässliche printf("\033[%d;%dH%s\n", 2, 2, "str"); verwendet Aber ich musste nur fragen, ob C++ eine andere Möglichkeit hatte, dies zu tun. Das Problem ist nicht einmal, dass es hässlich ist, kommt das Problem, wenn ich versuche, mir eine schönere Funktion wie so zu machen:Wie kann ich eine Zeichenfolge an der Konsole an bestimmten Koordinaten in C++ drucken?

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

Es funktioniert nicht, auch wenn ich zu (char*) typisierte. Ein weiteres Problem ist, dass ich die \n für die Seite, die aktualisiert werden soll ausdrucken ... Ich mag es einfach nicht printf im Allgemeinen zu verwenden.

Ähnlich cout statt printf zu verwenden, ich glaube, es sollte eine neuere Art und Weise sein, dies zu tun (im Idealfall eine Art und Weise, die mir erlaubt, auf einfache Weise Strings zu schreiben, wo ich auf dem Bildschirm werden soll, und im Idealfall eine Art und Weise, die nicht der Fall ist benötigt diese komischen Symbole: \033[%d;%dH)

Also, habe jemand von euch, was ich suche?

+1

besuchst Welche Plattform Sie arbeiten? – Jacob

+0

Ubuntu 9.04, ich benutze g ++, um – Shawn

Antwort

5

Was Sie tun, ist die Verwendung einiger sehr terminalspezifische magische Zeichen in einer ansonsten reinen C++ - Anwendung. Während dies funktioniert, wird es Ihnen wahrscheinlich viel leichter fallen, eine Bibliothek zu verwenden, die Sie davon abhält, mit terminalspezifischen Implementierungsdetails fertig zu werden, und Funktionen bereitstellt, die das tun, was Sie brauchen.

Untersuchen Sie, ob Flures oder Ncurses-Bibliotheken für Ihr System verfügbar sind.

11

Curses ist was Sie suchen.

+2

Oder die neuen Veriant nCurses zu kompilieren. –

+0

Ich kann nicht finden, was ich hinzufügen soll, um auf Flüche zugreifen zu können. Ich kann auch keine Dokumentation für die API finden. – Shawn

+1

@Shawn: 'man ncurses' hätte dir gesagt' ' – MSalters

2

Einige Verbesserungen an Ihre Funktion:

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

Diese Version:

  • können Sie jede beliebige Format-String und variable Argumentlisten
  • automatisch stdout
  • ohne Druck eine neue Zeile spült verwenden
  • verwendet x und y in der Formatzeichenfolge (Ihre Verwendung von x und x kann ein Tippfehler)

jedoch gewesen, weil varargs im Wesentlichen eine C-Funktion ist und nicht wirklich verstehen, C++ Objekte, würden Sie es so nennen müssen:

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

Eine bessere Option ist die Verwendung von Curses (für Unix-ähnliche Plattformen) oder Win32-Konsolenfunktionen (für Windows), wie in anderen Antworten erwähnt.

+0

was macht die fflush (stdout); Teil tun? – Shawn

+0

Normalerweise ist stdout "gepuffert", was bedeutet, dass die C - Laufzeitbibliothek die von Ihnen ausgedruckte Ausgabe aufruft und nur an die Konsole sendet, wenn (a) Sie eine neue Zeile ausgeben, (b) die Warteschlange voll wird oder (c) Sie die Datei. Die Verwendung von 'fflush()' ist in diesem Fall einfacher und offensichtlicher als das Drucken eines Zeilenumbaus (und verhindert Scroll-Probleme, wenn Sie versuchen, Daten in der unteren Zeile des Bildschirms zu drucken). –

8

Ich erinnere mich an gotoxy(x,y) in Turbo C++ (conio.h) - weiß nicht, ob es für Sie funktioniert. Es bewegt den Cursor zu den Koordinaten x und y.

EDIT: Wenn Sie Windows verwenden, ist hier ein gotoxy Klon:

#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' hat ein Leerzeichen drin. Achten Sie darauf, es zu entfernen. – Aistis

3

Erstens:

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

Sie wollen nicht das String-Argument kopieren, möchten Sie übergeben Sie es durch (const) Verweis. Auch die (nur) richtig ein char* von einem std::string zu bekommen, ist seine c_str() Memberfunktion aufzurufen:

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

Zu Ihrer Frage: C++ keine Möglichkeit hat, zu tun, was Sie wollen, aber es ermöglicht es Ihnen, Verwenden Sie plattformspezifische Möglichkeiten, dies zu tun. Sie müssten uns Ihre Plattform nennen, um sinnvolle Antworten zu erhalten.

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

// dies auf bestimmte ausgestorben einzige Problem arbeiten sollte, ist u von irgendwo wie 4,4 bis 2,2, das ist das Problem

-1

Ich habe ein wenig andere Methode gehen kippe. Ich bin mir nicht sicher, ob das besser ist als das Paket ncurses, also überlasse ich das den Wählern, um zu entscheiden.

Sie können das Grafik Paket in C++ verwenden, um einen Text an eine bestimmte Koordinate auf Ihrem Arbeitsbildschirm auszugeben. Die Syntax lautet outtextxy(x, y, text) ; Dabei sind x & y Koordinaten.

Ein Beispiel dafür ist:

int main(void) { 

    int gdriver = DETECT, gmode; 

   int x = 200, y = 200; 

  

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

  

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

   closegraph(); 

} 

Dieses kleine Programm Hallo Welt im Koordinaten gedruckt wird (200,200).

als Referenz zu dem, was Paket Grafiken können this link

+0

Das Grafikpaket ist nicht standardisiert und wahrscheinlich nicht verfügbar auf Ubuntu, dem Plattenformblatt des OP –

Verwandte Themen