Namensräume
Varianten
Aktionen

std::endl

Von cppreference.com
< cpp‎ | io‎ | manip
 
 
 
Input/output-Manipulatoren
Formatierung von Gleitkommazahlen
Ganzzahlformatierung
Boolean-Formatierung
Feldbreiten- und Füllzeichensteuerung
Andere Formatierungen
Leerzeichenverarbeitung
Ausgabe-Flushen
endl
(C++20)  

Statusflags-Manipulation
Zeit- und Geld-I/O
(C++11)
(C++11)
(C++11)
(C++11)
Gequoteter Manipulator
(C++14)
 
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) [bearbeiten]
Spült den Ausgabestrom
(Funktion-Template) [bearbeiten]
synchronisiert mit dem zugrunde liegenden Speichermedium
(public member function of std::basic_ostream<CharT,Traits>) [bearbeiten]