unterschied zwischen endl und \n

RuL3R

Commodore
Registriert
Dez. 2004
Beiträge
4.577
hi
wir lernen in der schule grade c++. unser lehrer konnte uns aber nicht erklären, wo der unterschied zwischen endl und \n ist. er weiß aber, dass es einen gibt.

(nicht der, dass das eine c und das andere c++ ist^^)
 
soweit ich weiß funktioniert endl plattformübergreifend immer richtig. \n versteht nicht unbedingt jedes Betriebssystem. :)
 
cout << "bla bla\n";

cout << "more bla bla" << endl;

Das endl manipuliert den Ausgabestrom.
Und zwar in der Weise, dass es ein in den Ausgabestrom ein "newline" Zeichen anhängt.
Zusätzlich wird, falls der Strom gepuffert ist, was bei Textausgabe auf den Bildschirm der Fall ist, der Strom "leergespült" (flush). Dies bewirkt eine sofortige Anzeige des Textes auf dem Bildschirm.

Wenn man nur \n benutzt, dann wird nur ein newline-Zeichen eingefügt.
Die Ausgabe wird aber nicht zwangsläufig sofort dargestellt, weil eben das "spülen" des Ausgabestroms fehlt.

Hier nachlesen:
http://www.cplusplus.com/ref/iostream/ostream/_endl.html
http://www.cplusplus.com/ref/iostream/ostream/flush.html

Dies ist ein guter Zeitpunkt, um sich mir Aus- und Eingabeströmen zu beschäftigen.
(Das sollte ich mir auch mal wieder zu Gemüte führen.)
 
Rumbah schrieb:
Aber ein Freund meinte, dass beim kompilieren \n durch das dem Betriebssystem entsprechende Zeichen ersetzt wird. Also für Windows CR/LF, für Unix LF und für Mac CR, und endl erst zur Laufzeit.

Passiert beides erst zur Laufzeit. Was soll der Compiler denn hier machen? CR/LF sind zwei Zeichen:
Code:
char c = '\n'
\n ist und bleibt \n.

Das '\n'-Handling in C++ passiert durch die Stream-Bibliothek (grob gesagt, cin/cout und Konsorten). Wird ein '\n' in einen Stream geschrieben, wird widen aufgerufen, was daraus das plattformspezifische "Newline" macht. Wie schon gesagt wurde, für Windows z.B. CRLF. Für's Lesen wird analog automatisch narrow aufgerufen, was das ganze dann wieder in ein '\n' konvertiert. Passiert alles im Hintergrund, ohne dass man sich Sorgen darüber machen müsste.

Ansonsten wurde es ja schon gesagt: endl schreibt ein '\n' und leert den Ausgabestream, sofern gepuffert.
 
Zuletzt bearbeitet:
Ach ja, das leerspülen kann man auch so erwirken:
Code:
fflush (stdout);
Hilfreich wenn man z.B. einen Fortschrittsbalken auf der Konsole zeichnen will. :)
 
Das wirkt sich dann aber z.B. nicht auf cout aus ;) (da es einen eigenen Streambuffer hat) sondern nur auf printf( ...), bzw fprintf( stdout, ...).

Übrigens, @RuL3R
Zitat: "nicht der, dass das eine c und das andere c++ ist^^"
Die Aussage ist falsch. '\n' ist "C und C++".
 
Zuletzt bearbeitet:
Und ob sich das darauf auswirkt, hab ich doch selbst schon ausprobiert bei meiner ultimativen Progressbar. :D

Code:
void
Matrix::progressbar (int init, int length, int progress){
  if (init==1){
    cout << "[";
    for (int i=0; i<length; i++) cout << ".";
    cout << "]";
    fflush (stdout);
  }
  else{
    if (length >= progress){
      for (int i=0; i<length+1; i++) cout << "\b";
      for (int i=0; i<progress+1; i++) cout << "*";
      for (int i=0; i<length-progress-1; i++) cout << ".";
      cout << "]";
      fflush (stdout);
    }
    else cout << "progressbar: value progress greater than length" << endl;
  }
}
 
Für den Fall, dass cout.sync_with_stdio() == true ist, sollte cout seinen Streambuffer gleich nach stdout schreiben. Wenn das mal jemand ausstellt, hast Du ein Problem ;) Wenn Du eh schon die Standard iostreams benutzt, warum dann nicht cout << flush / cout.flush()? Außerdem wird das Mixen von C-IO mit C++-IO als unschön angesehen
 
Zurück
Oben