std:: endl
|
Definiert im 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 Nur-Ausgabe-I/O-Manipulator, er kann mit einem Ausdruck wie
out
<<
std
::
endl
für jedes
out
vom Typ
std::basic_ostream
aufgerufen werden.
Inhaltsverzeichnis |
Hinweise
Dieser Manipulator kann verwendet werden, um sofort eine Ausgabezeile zu erzeugen, z.B. bei der Anzeige von Ausgaben eines langlaufenden Prozesses, der Protokollierung von Aktivitäten mehrerer Threads oder der Protokollierung von Aktivitäten eines Programms, das unerwartet abstürzen könnte. Ein explizites Leeren von
std::cout
ist ebenfalls notwendig vor einem Aufruf von
std::system
, wenn der gestartete Prozess Bildschirm-E/A durchführt. In den meisten anderen üblichen interaktiven E/A-Szenarien ist
std::endl
redundant bei Verwendung mit
std::cout
, 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 zeilengepuffert, und das Schreiben von
'
\n
'
verursacht ohnehin einen Flush, es sei denn
std
::
ios
::
sync_with_stdio
(
false
)
wurde ausgeführt. In diesen Situationen verschlechtert unnötiges
endl
nur die Leistung der Dateiausgabe, nicht die Standardausgabe.
Die Codebeispiele in diesem Wiki folgen Bjarne Stroustrup und The C++ Core Guidelines beim Flushen der Standardausgabe nur dort, wo es notwendig ist.
Wenn eine unvollständige Ausgabeziele abgeflusst werden muss, kann der std::flush Manipulator verwendet werden.
Wenn jedes Zeichen der Ausgabe sofort ausgegeben werden muss, kann der std::unitbuf Manipulator verwendet werden.
Parameter
| os | - | Referenz auf den Ausgabestream |
Rückgabewert
os (Referenz auf den Stream nach der Manipulation).
Beispiel
Mit
'
\n
'
anstelle von
endl
wäre die Ausgabe identisch, könnte jedoch 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
Siehe auch
|
steuert, ob die Ausgabe nach jedem Vorgang geleert wird
(Funktion) |
|
|
leert den Ausgabestrom
(Funktions-Template) |
|
|
synchronisiert mit dem zugrundeliegenden Speichergerät
(öffentliche Mitgliedsfunktion von
std::basic_ostream<CharT,Traits>
)
|