Cursor positionieren?
-
Hi(gh)!
Nachdem ich für mein Klimadaten-Programm die Lesefunktion implementiert habe (noch fehlerhaft, aber das ist eine andere Baustelle), stelle ich fest, dass die Ausgabe der Daten weit oberhalb des Konsolenfensters beginnt... wie bekomme ich es hin, dass sie unterhalb des letzten Eingabeprompts angezeigt werden? Aus DOS-Zeiten erinnere mich mich vage an irgendwas mit \033[Zeile;Spalte - mit printf? Ich habe es so versucht, aber es ändert sich nichts an der Ausgabe...
Hier der aktuelle Code, so weit relevant:
switch(f) { case '1': printf("\nName der Wetterstation: "); station = (char*)malloc(statsize * sizeof(char)); if (station == NULL) { perror("Speicher kann nicht zugewiesen werden"); exit(1); } f = getline(&station,&statsize,stdin); station[f-1]='\0'; read(station); display(temperatur, "Temperatur"); display(niederschlag, "Niederschlag"); break; // Funktion read() bool read(char* station) { bool flag=false; // zeigt an, ob von Groß- nach Kleinbuchstaben gewandelt wurde // char i; // Zählvariable if (station[0]>=65 && station[0]<=90) { station[0]+=32; // erster Buchstabe des Stationsnamens wird in Kleinbuchstaben gewandelt flag=true; } FILE* fp; fp = fopen(strcat(station,".cdat"), "rb"); // Datei wird als Binärdatei geöffnet! if (!fp) { printf("\nDatei kann nicht gelesen werden!"); return false; } if (flag == true) station[0]-=32; // erster Buchstabe des Stationsnamens wird wieder in Großbuchstaben gewandelt station[strlen(station)-5]='\0'; // Stationsname wird auf ursprüngliche Länge gekürzt fread(station, sizeof(char), strlen(station), fp); fread(latitude, sizeof(char), 11, fp); fread(cperiod, sizeof(char), 10, fp); fread(temperatur, sizeof(float), 12, fp); fread(niederschlag, sizeof(float), 12, fp); fread(formula, sizeof(char), strlen(formula), fp); if (fclose(fp) == EOF) { printf("\nDatei kann nicht geschlossen werden!"); return false; } return true; } // Funktion display () void display(float* daten, const char* typ) { printf("\033[10;1"); unsigned short i; for (i=0; i<DIM; i++) printf("\n%s für %s: %2.1f", typ, monate[i], daten[i]); }
Bis bald im Khyberspace!
Yadgar
-
@yadgar sagte in Cursor positionieren?:
\033[Zeile;Spalte
Am einfachsten wohl mit der WinAPI
COORD pos; pos.X = static_cast<SHORT> ( x ); pos.Y = static_cast<SHORT> ( y ); SetConsoleCursorPosition( hndl, pos );
Da Du die vielleicht nicht willst, habe ich selbst mal geschaut und habe folgendes gefunden
void position(int Zeile, int Spalte) { printf("\033[%d;%dH",Zeile,Spalte); }
http://public.beuth-hochschule.de/~kempfer/skript_informatik/Kap06.html
-
Hi(gh)!
@lemon03 sagte in Cursor positionieren?:
Am einfachsten wohl mit der WinAPI
Oops, ich hatte vergessen zu erwähnen, dass ich unter Linux unterwegs bin!
Bis bald im Khyberspace!
Yadgar
-
@yadgar sagte in Cursor positionieren?:
Oops, ich hatte vergessen zu erwähnen, dass ich unter Linux unterwegs bin!
und warum schreibst du das dann nicht bei linux rein?
also für linux (bzw unixoide betriebssysteme allgemein und für windows meine ich auch) gibt es eine bibliothek, die ncurses heißt, und damit kannst du die tollsten sachen machen.
-
read ist ein ungünstiger NAme für eine eigene Funktion, da es den schon im POSIX-Standard gibt.
Zum testen ob ein Zeichen bestimmte Eigenschaften (groß, klein, Leerzeichen, ...) hat, gibt es in ctype.h nette Funktionen.
Dort gibt es auch tolower().strlen
gibt die Anzahl Zeichen im String zurück. Nicht jedoch die maximale Anzahl, die man dort ablegen kann.char name [200] = "Ich";
strlen(name) gibt 3.Mit
fread
wird direkt ausder Dateidem Stream in den Speicher gelesen, Ohne Interpretation der Daten, wie es z.B. beifscanf
gemacht wird.
-
@yadgar sagte in Cursor positionieren?:
Oops, ich hatte vergessen zu erwähnen, dass ich unter Linux unterwegs bin!
Die ANSI-Control-Sequenzen müssten doch auch für Linux gelten?
-
@lemon03 sagte in Cursor positionieren?:
@yadgar sagte in Cursor positionieren?:
Oops, ich hatte vergessen zu erwähnen, dass ich unter Linux unterwegs bin!
Die ANSI-Control-Sequenzen müssten doch auch für Linux gelten?
Wenn ich auf system("clear") verzichte, tritt das Problem nicht auf... und da es sich ja nur um eine "kosmetische" Angelegenheit handelte, habe ich es erst einmal zurückgestellt... für mein aktuelles Problem schaut euch bitte den neueröffneten Thread an!