std:: endl
|
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>
)
|