endl leert Ausgabebuffer



  • Hi ihr,

    Habe gerade gelesen, dass der Manipulator 'endl' den Ausgabebuffer leert.
    Das bedeutet, dass wenn ich endl weglasse der Ausgabebuffer nicht geleert wird bleibt er erhalten und müsste bei einer weiteren Ausgabe auf ein neues eine Fehlerhafte Ausgabe erzeugen.

    Habe gedacht, dass das logisch klingt doch folgendes Programm von mir läuft einwandfrei.

    #include <iostream>
    using namespace std;
    int main(void)
    {
       cout << "HALLO WELT\n";
       cout << "GUTEN ABEND\n";
       system("Pause");    
    }
    

    Weiß jemand ein Beispiel, welches verdeutlicht, wie wichtig es ist, dass 'endl'|'flush' oder 'ends' geschrieben wird.

    Gut wäre es auch, wenn ein Beispiel da wäre, was veranschaulicht, was passiert, wenn ich den Ausgabebuffer vom Eingabebuffer trenne, durch cin.tie(0);

    cya

    David



  • 'endl' erzeugt intern einen Zeilenumbruch und ruft dann die Methode flush() auf, welche die Ausgabe erzwingt.

    Sobald aber der interne Puffer voll ist, wird automatisch ein flush() erzeugt, d.h. die Ausgaben werden niemals überschrieben.

    Sinnvoll sind die flush() Aufrufe z.B. bei Log-Dateien, so daß die Daten sofort rausgeschrieben werden (und nicht erst wenn zufällig der Ausgabepuffer voll ist).
    Und bei Multithreading-Programmen kann es Sinn machen, dies zu erzwingen (wobei es ohne explizites Locking gerade dort zu abgehackten Texten kommen kann - aber es wird niemals der Puffer geleert, ohne vorher ausgegeben worden zu sein).

    Und bei cin.tie(0) müßtest du selber für die Synchronisation sorgen:

    cin.tie(0);
    cout << "Gib Text ein:";
    cin >> sText;
    

    Nun könnte es passieren, daß der Text nicht vorher ausgegeben wird (habe ich aber selber auch noch nicht ausprobiert).



  • Das Programm stört es nicht, wann und ob der Ausgabepuffer geleert wird (das macht der Stream auch eigenständig, wenn er keinen Platz mehr hat - bzw. spätestens im Destruktor). Interessant wird es nzur, wenn dir wichtig ist, wann die Ausgabe durchkommt (oder die Möglichkeit besteht, daß das Programm unvorbereitet abstürzt):

    #include <iostream>
    using namespace std;
    int main(void)
    {
       cout << "HALLO WELT\n";
       cout << "GUTEN ABEND\n";
       abort();//beendet das Programm SOFORT - ohne Aufräumarbeiten
    }
    

    (starte dieses Programm mal aus der Eingabeaufforderung - da bestehen gute Chancen, daß nur Teile der Ausgabe durchkommen)

    @cin.tie(): tie() bewirkt auch ein automatisches flush des angebundenen Streams, bevor etwas mit dem "bindenden" Stream gemacht wird - im Fall cin/cout bewirkt es, daß die Eingabe-Anweisungen immer zu den Eingaben passen:

    //cin.tie(0);
    cout<<"bitte erste Zahl eingeben:"
    cin>>i1;
    cout<<"bitte zweite Zahl eingeben:"
    cin>>i2;
    

    (wenn du cin und cout entkoppelst, wartet das Programm erst auf deine Eingaben und teilt dir dann mit, was es erwartet hätte)

    PS: ends brauchst du normalerweise gar nicht - das war nur interessant mit char*-Streams, um der Ausgabe einen Null-Terminator anzuhängen.


Anmelden zum Antworten