Zeile einrücken bei der Ausgabe auf der Konsole



  • Log-Meldungen auf ne fixe Konsolenbreite zu formatieren finde ich komisch.
    Was ich mal gemacht habe, wo ich sehr glücklich damit war, war mehrzeilige Log-Meldungen (also welche die wirklich Zeilenumbrüche enthalten) so zu formatieren wie hier im Kopfposting beschrieben. Das verbessert IMO sehr die Übersichtlichkeit von Logfiles - hilft beim Überfliegen. Allerdings auch nur wenn man in dem Text-Editor/-Viewer den man verwendet das automatischen Umbrechen von langen Zeilen ausgeschaltet hat.

    Ich würde dir in diesem Fall also empfehlen den Rat von @manni66 zu befolgen:

    Dann frag doch mal nach, was du genau machen sollst.



  • @honeybee sagte in Zeile einrücken bei der Ausgabe auf der Konsole:

    @manni66
    Breiter kann man die Konsole nicht ziehen, die geht schon über das ganze Fenster.

    In dem Fall, sag doch einfach Deinem Betreuer er solle sich einen größeren Bildschirm kaufen:D

    Spaß beiseite, ich würde keine Zeilennummern reinschreiben, weil das jeder ansatzweise taugliche Texteditor anzeigt bzw. anzeigen kann.

    Vielleicht noch eckige Klammern um das Zeug wie Datum etc. und dann finde ich hebt sich der Text in der nächsten Zeile auch besser ab.

    [2017-09-12 1234] "irgendein langer Text"
    [2017-09-12 2345] "nooooooooooooccch
    ein längerer Text"
    [2017-09-12 3456] "irgendein langer Text"

    Wenn das nicht gefällt, wäre die nächste Lösung Notepad++ runterladen und eine User-Defined language anlegen, die das Logfile highlighted. Ist super einfach, habs zum ersten Mal gemacht und geht in 2 Minuten. Ist nicht weniger windows-abhängig als in der Konsole rumfrickeln.

    Wenn das immer noch nicht passt (dann wird aber die Konsolenausgabe auch nicht passen) kann man darüber nachdenken eine HTML Tabelle zu generieren.

    LG



  • Danke für alle eure Antworten! Ich habe es jetzt erstmal so gelöst, wie ich es bei @Belli und @DirkB verstanden habe. Vermutlich werde ich es aber irgendwann nochmal ändern weil das Format ja jetzt abhängig von der Fenstergröße ist.
    Hier meine Lösung (Ich habe versucht es zum Verständnis etwas zu kürzen):

     void testV1::ausgebenderDatei()
    {
    string aktDatum;
    int aktFehlercode;
    string aktText;
    int textSize;
    
    //Schleife zum Durchlaufen von my_file(Array wo meine Daten gespeichert sind)
    for (int i=0; i<1000; i++)
    {
    //Laufvariable linksbündig ausgeben
    cout << setiosflags(ios::left) << setw(4) << i << "  " << resetiosflags(ios::left);
    
    //Methoden um Daten aus der i-ten-stelle von my_file zu bekommen
    aktDatum = getDatum();
    aktFehlercode = getFehlercode();
    aktText = getText();
    
    textSize = aktText.size();
    
    //Ausgabe von Datum & Fehlercode
    cout << Datum << "  ";
    cout.file('0'); //Leerstellen mit 0 füllen
    cout.file(' ');
    
    //bei Ueberschreiten der Zeilenlänge(203 Stellen)
       if(textSize > 203)
         { 
          int AnzahlvonZeilenText = TextSize /202 +1;
          for (int y = 0, y< AnzahlvonZeilenText; y++)
          {
           // String auftrennen sooft wie die Anzahl an benötigten Zeilen in string mit 202 Zeichen
            string s;
            s = aktText.substr(y * 202, 202);
            cout << s;
            
           //bei einem string der kleiner ist als 202 zeichen sind keine Leerzeichen notwendig
            if (s.size() <202)
            {
              break;
            }
           //Leerzeichen um Text einzuruecken
           for (int l = 0; l< 35 ; l++)
           {
             cout << "  ";
           }
          }
    cout << endl;
    }
    //Ausgabe bei kleinen Textzeilen
    else
    {
    cout << aktText << endl;
    }
    }
    }
    


  • @honeybee sagte in Zeile einrücken bei der Ausgabe auf der Konsole:

    //Leerzeichen um Text einzuruecken

    Da reicht ein Leerzeichen mit einer Mindestbreite von 35 (bzw) die aktuelle Länge) Zeichen aus.

    Und die maximale Textlänge (202) gehört zumindest in eine (globale) Konstante.
    (besser wäre die aktuelle Konsolenbreite)

    Und spiel mal mit den Grenzbereichen (201, 202 und 203 lange Zeilen) rum, ob das passt.



  • @dirkb sagte in Zeile einrücken bei der Ausgabe auf der Konsole:

    Da reicht ein Leerzeichen mit einer Mindestbreite von 35 (bzw) die aktuelle Länge) Zeichen aus.

    Gute Idee, da wäre ich gar nicht drauf gekommen!

    @dirkb sagte in Zeile einrücken bei der Ausgabe auf der Konsole:

    (besser wäre die aktuelle Konsolenbreite)

    würdest du die aktuelle Konsolenbreite vorher festlegen? ähnlich wie @Zhavok es vorgeschlagen hat?
    Oder kann man es auch so lösen, dass sich das Format anpasst(also sich die Konstante ändert), nachdem ich das Programm gestartet habe, und dann erst auf den knopf zum maxmieren des Fensters klicke?



  • @honeybee sagte in Zeile einrücken bei der Ausgabe auf der Konsole:

    Oder kann man es auch so lösen, dass sich das Format anpasst(also sich die Konstante ändert), nachdem ich das Programm gestartet habe, und dann erst auf den knopf zum maxmieren des Fensters klicke?

    Klar. Dann ist es aber keine Konstante mehr sondern eine Variable.

    Aber da wäre es sinnvoll, diesen Wert vom Ereignis "Fenstergröße geändert" steuern zu lassen.



  • @dirkb sagte in Zeile einrücken bei der Ausgabe auf der Konsole:

    Aber da wäre es sinnvoll, diesen Wert vom Ereignis "Fenstergröße geändert" steuern zu lassen.

    Ich hab versucht nachzulesen wie man so etwas verwirklichen kann, finde aber nichts sinnvolles. Kannst du noch genauer sagen wie du sowas mache würdest? Oder kennst du ne Seite wo ich das nachlesen kann?



  • Naja, für den Anfang könntest Du einfach vor jeder Ausgabe Deiner Daten die Konsolenbreite in Zeichen auslesen ...



  • @belli
    Danke für deine Hilfe! Es ist noch nicht die perfekte Lösung, weil ich ja nach durchlaufen des Programms die Leerzeichen schon gesetzt habe und wenn ich dann das Fenster maximiere sie einfach mitten im text liegen aber immerhin kann ich jetzt vorher die Größe meines Fensters festlegen.
    Für alle die es interessiert... ich habe jetzt folgende neue Methode in meinem Code eingefügt und anstelle der 202 die ich oben benutzt habe, setze ich jetzt "breite" in meiner Methode zum ausgeben der Datei ein.

     int columns, breite;
    void test::groesseDerKonsole()
    {
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(GeStdHandle(STD_OUTPUT_HANDLE), &csbi);
    columns = csbi.srWindow.Right - csbi.srWindow.Left + 1; //Spaltenbreite
    breite = columns -35;
    }
    


  • Mhm ... Du könntest natürlich auch der Konsole eine von Dir gewünschte, unveränderliche Größe geben ...