std::endl
| Definiert in Header <ostream> |
||
| template< class CharT, class Traits > std::basic_ostream<CharT, Traits>& endl( std::basic_ostream<CharT, Traits>& os ); |
||
Fügt ein Zeilenumbruchzeichen in die Ausgabesequenz os ein und leert sie, als ob durch Aufruf von os.put(os.widen('\n')) gefolgt von os.flush().
Dies ist ein reiner Ausgabe-I/O-Manipulator, er kann mit einem Ausdruck wie out << std::endl für jedes out vom Typ std::basic_ostream aufgerufen werden.
Inhalt |
[bearbeiten] Hinweise
Dieser Manipulator kann verwendet werden, um eine Zeile der Ausgabe sofort zu erzeugen, z. B. wenn Ausgabe von einem langlaufenden Prozess angezeigt wird, die Aktivität mehrerer Threads protokolliert wird oder die Aktivität eines Programms protokolliert wird, das unerwartet abstürzen könnte. Ein explizites Leeren von std::cout ist auch vor einem Aufruf von std::system erforderlich, wenn der gestartete Prozess eine Bildschirm-I/O durchführt. In den meisten anderen üblichen interaktiven I/O-Szenarien ist std::endl redundant, wenn es mit std::cout verwendet wird, da jede Eingabe von std::cin, Ausgabe an std::cerr oder Programmbeendigung einen Aufruf von std::cout.flush() erzwingt. Die Verwendung von std::endl anstelle von '\n', die von einigen Quellen empfohlen wird, kann die Ausgabeleistung erheblich beeinträchtigen.
In vielen Implementierungen ist die Standardausgabe zeilenweise gepuffert, und das Schreiben von '\n' bewirkt sowieso ein Leeren, es sei denn, std::ios::sync_with_stdio(false) wurde ausgeführt. In diesen Situationen verschlechtert ein unnötiges endl nur die Leistung der Dateiausgabe, nicht die der Standardausgabe.
Die Codebeispiele auf diesem Wiki folgen Bjarne Stroustrup und The C++ Core Guidelines, indem die Standardausgabe nur dort geleert wird, wo es notwendig ist.
Wenn eine unvollständige Zeile der Ausgabe geleert werden muss, kann der Manipulator std::flush verwendet werden.
Wenn jedes Zeichen der Ausgabe geleert werden muss, kann der Manipulator std::unitbuf verwendet werden.
[bearbeiten] Parameter
| os | - | Referenz auf den Ausgabestream |
[bearbeiten] Rückgabewert
os (Referenz auf den Stream nach der Manipulation).
[bearbeiten] Beispiel
Mit '\n' anstelle von endl wäre die Ausgabe dieselbe, würde aber möglicherweise nicht in Echtzeit erscheinen.
#include <chrono> #include <iostream> template<typename Diff> void log_progress(Diff d) { std::cout << std::chrono::duration_cast<std::chrono::milliseconds>(d) << " passed" << std::endl; } int main() { std::cout.sync_with_stdio(false); // on some platforms, stdout flushes on \n static volatile int sink{}; const auto t1 = std::chrono::high_resolution_clock::now(); for (int i = 0; i < 5; ++i) { for (int j = 0; j < 10000; ++j) for (int k = 0; k < 20000; ++k) sink += i * j * k; // do some work log_progress(std::chrono::high_resolution_clock::now() - t1); } }
Mögliche Ausgabe
566ms passed 1133ms passed 1699ms passed 2262ms passed 2829ms passed
[bearbeiten] Siehe auch
| Steuert, ob die Ausgabe nach jeder Operation geflusht wird (Funktion) | |
| Spült den Ausgabestrom (Funktion-Template) | |
| synchronisiert mit dem zugrunde liegenden Speichermedium (public member function of std::basic_ostream<CharT,Traits>) |