Namespaces
Variants

std:: endl

From cppreference.net
< cpp ‎ | io ‎ | manip
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> )