Namespaces
Variants

std:: endl

From cppreference.net
< cpp ‎ | io ‎ | manip
Definido en el encabezado <ostream>
template < class CharT, class Traits >
std:: basic_ostream < CharT, Traits > & endl ( std:: basic_ostream < CharT, Traits > & os ) ;

Inserta un carácter de nueva línea en la secuencia de salida os y la vacía como si se llamara a os. put ( os. widen ( ' \n ' ) ) seguido de os. flush ( ) .

Este es un manipulador de E/S de solo salida, puede ser llamado con una expresión como out << std :: endl para cualquier out de tipo std::basic_ostream .

Contenidos

Notas

Este manipulador puede utilizarse para producir una línea de salida inmediatamente, por ejemplo, al mostrar la salida de un proceso de larga duración, registrar la actividad de múltiples hilos o registrar la actividad de un programa que puede fallar inesperadamente. Un vaciado explícito de std::cout también es necesario antes de una llamada a std::system , si el proceso creado realiza cualquier operación de E/S en pantalla. En la mayoría de los otros escenarios habituales de E/S interactiva, std::endl es redundante cuando se usa con std::cout porque cualquier entrada desde std::cin , salida a std::cerr , o terminación del programa fuerza una llamada a std:: cout . flush ( ) . El uso de std::endl en lugar de ' \n ' , recomendado por algunas fuentes, puede degradar significativamente el rendimiento de la salida.

En muchas implementaciones, la salida estándar tiene búfer por líneas, y escribir ' \n ' provoca un vaciado de todas formas, a menos que se haya ejecutado std :: ios :: sync_with_stdio ( false ) . En esas situaciones, el uso innecesario de endl solo degrada el rendimiento de la salida a archivo, no de la salida estándar.

Los ejemplos de código en esta wiki siguen a Bjarne Stroustrup y The C++ Core Guidelines al vaciar el flujo de salida estándar solo cuando es necesario.

Cuando una línea de salida incompleta necesita ser vaciada, puede utilizarse el std::flush manipulador.

Cuando cada carácter de salida necesita ser vaciado, se puede utilizar el std::unitbuf manipulador.

Parámetros

os - referencia al flujo de salida

Valor de retorno

os (referencia al flujo después de la manipulación).

Ejemplo

Con ' \n ' en lugar de endl , la salida sería la misma, pero puede no aparecer en tiempo real.

#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);
    }
}

Salida posible:

566ms passed
1133ms passed
1699ms passed
2262ms passed
2829ms passed

Véase también

controla si la salida se vacía después de cada operación
(función)
vacía el flujo de salida
(plantilla de función)
sincroniza con el dispositivo de almacenamiento subyacente
(función miembro pública de std::basic_ostream<CharT,Traits> )