in c Cursor positionieren [für die cmd.exe unter Windows]

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
Tonio
Beiträge: 7
Registriert: Fr Nov 13, 2015 8:39 am

in c Cursor positionieren [für die cmd.exe unter Windows]

Beitrag von Tonio » Fr Nov 13, 2015 9:14 am

Hallo,

ich lerne gerade C. Mein erstes Programm läuft in der Komandozeile.
Dabei gibt es eine Eingabemöglichkeit.
Links muss der Cursor blinken.
Rechts daneben steht als Text in Zeilen untereinander die Beschreibung verschiedener Eingabe-Möglichkeiten. Etwa so:

_ (blinkender Cusor) M = Mitarbeiter
T = Termine
u.s.w.
...
B = Beenden

Nachdem ich die Auswahl getroffen habe, tut das Programm etwas und ein neuer Bildschirm mit den gewünschten Infos oder einer neuen Auswahl oder Eingabemaske erscheint.

Aber wie kriege ich den Cursor wieder auf die Höhe der ersten geschriebenen Zeile neben der ja links noch Platz ist? Nach links kriege ich ihn mit \r.

Kann mir jemand helfen?

Tonio

Edit by Xin: Betreff erweitert

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: in c Cursor positionieren

Beitrag von Xin » Fr Nov 13, 2015 12:31 pm

Moin,
Tonio hat geschrieben:Aber wie kriege ich den Cursor wieder auf die Höhe der ersten geschriebenen Zeile neben der ja links noch Platz ist? Nach links kriege ich ihn mit \r.
Nur, um die Vorstellung hinzubekommen: Ein Terminal ist eine Datenabladestation. Du spuckst Test aus und das wird dann angezeigt. In den (wirklich sehr) klassischen Computern ist ein Terminal kein Bildschirm, sondern ein Drucker. Darum ist die Idee einen Cursor zu positionieren (oder überhaupt einen Cursor zu haben) etwas vergleichsweise Modernes.

Kurz: Der Zeichensatz hat keine Standard-Anweisungen dafür, um den Cursor zu positionieren.

Gehen wir mal davon aus, dass Du vernünftigerweise auf einem Linux-System das programmieren lernst. In dem Fall kannst Du "ANSI-Sequenzen" nutzen. Die funktionieren teilweise auch auf guten Druckern, da wird das Papier halt dann wieder zurückgespult. Wir reden hier von klassischen Druckern, nicht von Tintenstrahlern oder Laserdrucken ;)

Diese ANSI-Sequenzen werden von allen modernen Shells unterstützt, also zum Beispiel Linux, Mac oder auch klassischen Computern wie dem Amiga. Die Sequenz zum Setzen des Cursors lautet hier "ESC [ P1;P2 H".
Also in C

Code: Alles auswählen

printf( "\0x1B[%d;%dH", Zeile, Spalte );
Und jetzt lass mich raten, Du nutzt ein Betriebsystem ohne eine moderne Shell: Windows? :)


Unter Linux gibt es noch die sogenannte Curses-Library, die entsprechende Funktionen anbietet, unter Windows gibt es mit conio.h und hierfür die Funktion gotoxy:

Code: Alles auswählen

#include<stdio.h>
#include<conio.h>

int main(void)
{
     clrscr();              // Bildschirm löschen
     gotoxy(50,15);    // Cursor positionieren
     printf("Hello world");
     getch();              // Tastendruck abwarten
     return 0;
}
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Tonio
Beiträge: 7
Registriert: Fr Nov 13, 2015 8:39 am

Re: in c Cursor positionieren

Beitrag von Tonio » Fr Nov 13, 2015 2:16 pm

Hallo,

danke für die Erklärung. Ich habs begriffen. Ich hab auch nur Windows.
Und es klappt nicht.

Ich bekomme folgende Meldungen:

undefined reference to `clrscr'
undefined reference to `gotoxy'

ist vielleicht irgendwas nicht installierrt?

Gruß
Tonio

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8859
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: in c Cursor positionieren

Beitrag von Xin » Fr Nov 13, 2015 2:42 pm

Tonio hat geschrieben:Hallo,

danke für die Erklärung. Ich habs begriffen. Ich hab auch nur Windows.
Und es klappt nicht.

Ich bekomme folgende Meldungen:

undefined reference to `clrscr'
undefined reference to `gotoxy'

ist vielleicht irgendwas nicht installierrt?
Borland C. ^^

Ich gebe zu, ich habe mir das unter Windows nie angetan. Wenn Du Visual Studio nutzt, kennt die conio kein gotoxy oder clrscr, wie ich gerade festgestellt habe. Aber das kann man sich ganz einfach selbst schreiben (aka aus dem Netz kopieren).

Code: Alles auswählen

#include<stdio.h>
#include<conio.h>
#include <Windows.h>

void   clrscr ()
{
    COORD   coordScreen   =   {  0,   0  };  
    DWORD   cCharsWritten;  
    CONSOLE_SCREEN_BUFFER_INFO   csbi;  
    DWORD   dwConSize;  
    HANDLE   hConsole   =   GetStdHandle (STD_OUTPUT_HANDLE);  
   
    GetConsoleScreenBufferInfo (hConsole,   & csbi);  
    dwConSize   =   csbi.dwSize.X   *   csbi.dwSize.Y;  
    FillConsoleOutputCharacter (hConsole,   TEXT (' '),
                                                          dwConSize,  
                                                          coordScreen,
                                                          & cCharsWritten);  
    GetConsoleScreenBufferInfo (hConsole,   & csbi) ;  
    FillConsoleOutputAttribute (hConsole,
                                                          csbi.wAttributes,
                                                          dwConSize,
                                                          coordScreen,
                                                          & cCharsWritten);  
    SetConsoleCursorPosition (hConsole,   coordScreen);  
}

void gotoxy(int x, int y)
{
    COORD c = { x, y };  
    SetConsoleCursorPosition(  GetStdHandle(STD_OUTPUT_HANDLE) , c);
}

int main(void)
{
     clrscr();              // Bildschirm löschen
     gotoxy(50,15);    // Cursor positionieren
     printf("Hello world");
     _getch();              // Tastendruck abwarten
     return 0;
}
Alternativ kannst Du mit CygWin auch die ANSI-Steuercodes nutzen. :)
Ich ändere mal den Topic-Titel, denn das ist eigentlich doch recht interessant - so dass es günstig wäre die Lösungen per Google auch hier finden zu können.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Tonio
Beiträge: 7
Registriert: Fr Nov 13, 2015 8:39 am

Re: in c Cursor positionieren [für die cmd.exe unter Windows

Beitrag von Tonio » Mo Nov 16, 2015 12:09 pm

:D :D - Hallo Xin,

recht, recht vielen Dank!! Es funktioniert.
Ich habe es einfach abkopiert und werde mich auch noch damit beschäftigen, es bis zum Verständnis zu durchdringen.

Mit herzlichen Grüßen :D :D

Tonio

Antworten