cout eine zeile höher?



  • Hallo Leute,
    ich habe folgendes Problem: Ich habe ein Programm geschrieben, dass je nach Datenlage zwischen Sekunden und Tagen läuft, so dass ich als Kontrolle, wie lange ich noch ca. warten muss eine Ausgabe eingebaut habe. Die sieht dann folgendermassen aus:

    0 % der 9819 Zeilen, Zeit seit Beginn (in sec.): 2
    1 % der 9819 Zeilen, Zeit seit Beginn (in sec.): 5
    2 % der 9819 Zeilen, Zeit se
    etc.......

    jetzt würde ich die Ausgabe gerne so steuern, dass zum Schluss nicht eine grosse Liste da steht, sondern dass automatisch bei jeder neuen Ausgabe, die alte aktualisiert wird. Das macht Sinnn für meine Log-Ausgabe. Gibt es dafür eine einfache Lösung, oder ist das praktisch unmöglich (sprich, was auf dem Bildschirm erscheint, bleibt auch da?).
    Viele Grüsse von einem Forum-Neuling,
    Stephan



  • naja, ch weiß jetzt nicht in wie weit standard, da ich BCB benutze, aber WENN ich da mal sowas gebraucht habe, gab es da gotoxy (damit hast cursor auf gewünschte posi gesetzt)

    od clrscr() glaub ich, um den bildschirm zu leeren.....



  • Mit Standard C++ ist das nicht möglich. Schau mal in die Konsolen-FAQ hier im Forum.



  • für windows:

    #include <cstdlib>
    
    #include <windows.h>
    
    void clrscr()
    {
      std::system( "cls" );
    }
    
    void gotoxy( unsigned x, unsigned y )
    {
     COORD pos;
     pos.X = x;
     pos.Y = y;
     SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), pos );
    }
    


  • Vielen Dank für Eure schnellen Antworten.
    Leider sind sie nicht ganz die Lösung, da ich auf Linux programmiere und da funktionieren diese beiden Befehle nicht ganz.
    Ich habe das jetzt ganz unelegant das Problem mit system("clear") gelöst, damit ist die Ausgabe am Bildschirm jedenfalls so, wie ich mir das vorstelle. Allerdings gibt es jetzt totales Chaos, wenn ich die Ausgabe auf eine Datei umlenke....
    Naja, muss ich hatl noch basteln...
    Grüsse und frohes Schaffen,
    Stephan



  • jetzt habe ich doch noch eine elegante Lösung gefunden:
    cout << "\033[2J\033[1;1H";
    wenn man dann die vorherigen Ausgaben in einem Stringstream speichert, sieht es fast so aus, als würden sich nur die Prozente bewegen. Es löst allerdings nicht das Problem mit Ausgabe auf Datei umlenken, da muss wieder ein Schalter rein, eigentlich unschön...
    Grüsse,
    Stephan



  • Erstens dürfte es unter Linux auch eine gotoxy Funktion geben (ich bin mir allerdings nicht sicher, wo die zu finden ist - erster Ansatz wäre <conio.h>).

    Und zweitens: In einer Datei rumzuspringen ist zum Glück um einiges einfacher - mit tellp() erhältst du die aktuelle Position in der Datei, mit seekp() kannst du deinen Schreibzeiger auf diese Position zurückschieben.



  • Dieser Thread wurde von Moderator/in HumeSikkins aus dem Forum C++ in das Forum Linux/Unix verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hallo Leute,
    nach ein paar Versuchen ist es mir gelungen, die Konsolenausgabe so zu manipulieren, wie ich mir das wünsche, ich habe für alle den Tip, mal unter
    http://rrbrandt.dyndns.org:60000/docs/tut/redes/ansi.php
    nachzuschauen.
    Das ganze sieht dann unter C++ so aus:

    cout << "\33[3A"; // für drei Zeilen hoch
        cout << "\33[70D "; // für 70 zeichen nach links, stopt bei Zeilenanfang
    

    Jetzt ist das schön anzuschauen, aber wenn ich die stdout-stream auf eine Datei umlenke (z.B.: './a.out > temp'), kommt das da natürlich nicht so raus. So, jetzt endlich meine Frage: Kann mein Programm erkennen, ob der Ausgabestream auf eine Datei umgelenkt ist? Ich denke da an sowas ähnliches, wie Argumente an das ausfürende Program übergeben.... (argv, argc, etc.).
    Viele Grüsse,
    Stephan
    p.s. sorry für zunächst falsches Forum


Anmelden zum Antworten