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.



  • @yadgar

    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 aus der Datei dem Stream in den Speicher gelesen, Ohne Interpretation der Daten, wie es z.B. bei fscanf 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!


Log in to reply