Muchos libros de C ++ contienen código de ejemplo como este ...
std::cout << "Test line" << std::endl;
... así que siempre he hecho eso también. Pero en cambio, he visto mucho código de desarrolladores que trabajan como este:
std::cout << "Test line\n";
¿Hay alguna razón técnica para preferir uno sobre el otro, o es solo una cuestión de estilo de codificación?
c++
coding-style
iostream
c++-faq
Head Geek
fuente
fuente
'\n'
.Respuestas:
Los distintos caracteres de final de línea no importan, suponiendo que el archivo esté abierto en modo texto, que es lo que obtienes a menos que pidas un binario. El programa compilado escribirá lo correcto para el sistema compilado.
La única diferencia es que
std::endl
vacía el búfer de salida y'\n'
no lo hace. Si no desea que el búfer se vacíe con frecuencia, úselo'\n'
. Si lo hace (por ejemplo, si desea obtener toda la salida y el programa es inestable), usestd::endl
.fuente
::std::cerr
lugar de hacerlo,::std::cout
ya que no tiene búfer y se vacía con todas y cada una de las operaciones de salida.stderr
es por "errores". Más bien, es para mensajes de diagnóstico fuera de banda, si lo desea. Debería ser posible decir./prog > file
y almacenar solo la carga útil real del programa, pero al programa le gustaría generar mucha más información de estado, incluso en una interacción normal.La diferencia puede ilustrarse con lo siguiente:
es equivalente a
Entonces,
std::endl
Si desea forzar un vaciado inmediato a la salida.\n
si le preocupa el rendimiento (que probablemente no sea el caso si está utilizando el<<
operador).Yo uso
\n
en la mayoría de las líneas.Luego usa
std::endl
al final de un párrafo (pero eso es solo un hábito y generalmente no es necesario).Contrariamente a otras afirmaciones, el
\n
carácter se asigna a la secuencia correcta de final de línea de la plataforma solo si la secuencia va a un archivo (std::cin
ystd::cout
es especial pero todavía archivos (o similar a un archivo )).fuente
cout
está vinculado acin
, lo que significa que si lee la entrada decin
,cout
se eliminará primero. Pero si desea mostrar una barra de progreso o algo sin leercin
, entonces, seguro, el vaciado es útil.operator<<
no es eficiente, ¿o qué alternativa usar para el rendimiento? Por favor, muéstrame algún material para entender esto más a fondo.sync_with_stdio(false)
y no vacíe su salida continuamente. Deje que la biblioteca determine cuándo hacerlo. stackoverflow.com/a/1926432/14065sync_with_stdio
hace que iostreams sea tan rápido como stdio. No lo hacePuede haber problemas de rendimiento,
std::endl
obliga a una descarga de la secuencia de salida.fuente
Hay otra función llamada implícita allí si vas a usar
std::endl
a) llama al operador
<<
una vez.b) llama al operador
<<
dos veces.fuente
std::cout << "Hello" << "\n";
?<<
2 también serían en el caso a , por lo que no afirmaría que la necesidad de una o dos<<
(o dos llamadas de función en general) sea un diferencia entre\n
yendl
.Recordé haber leído sobre esto en el estándar, así que aquí va:
Consulte el estándar C11 que define cómo se comportan las transmisiones estándar, ya que los programas C ++ interactúan con la CRT, el estándar C11 debe regir la política de descarga aquí.
Esto significa que
std::cout
ystd::cin
están plenamente compensados si y sólo si se están refiriendo a un dispositivo no interactivo. En otras palabras, si stdout está conectado a un terminal, entonces no hay diferencia en el comportamiento.Sin embargo, si
std::cout.sync_with_stdio(false)
se llama, entonces'\n'
no provocará una descarga incluso en dispositivos interactivos. De'\n'
lo contrario, es equivalente astd::endl
menos que se canalice a los archivos: c ++ ref en std :: endl .fuente
Ambos escribirán los caracteres de final de línea apropiados. Además de eso, endl hará que se confirme el búfer. Por lo general, no desea usar endl al hacer E / S de archivo porque las confirmaciones innecesarias pueden afectar el rendimiento.
fuente
No es un gran problema, pero endl no funcionará en boost :: lambda .
fuente
Si usa Qt y
endl
, podría terminar accidentalmente usando un incorrectoendl
que le da resultados muy sorprendentes. Consulte el siguiente fragmento de código:Tenga en cuenta que escribí en
endl
lugar destd::endl
(lo que habría sido correcto) y aparentemente hay unaendl
función definida en qtextstream.h (que es parte de QtCore).El uso en
"\n"
lugar deendl
eludir por completo cualquier posible problema de espacio de nombres. Este también es un buen ejemplo de por qué poner símbolos en el espacio de nombres global (como Qt lo hace por defecto) es una mala idea.fuente
using namespace std;
? :-)using namespace std;
. Se considera una mala práctica. Consulte ¿Por qué está "usando el espacio de nombres estándar?" considerado una mala práctica?Siempre tuve la costumbre de usar std :: endl porque me resulta fácil de ver.
fuente
El
std::endl
manipulador es equivalente a'\n'
. Perostd::endl
siempre descarga la corriente.fuente
Si tiene la intención de ejecutar su programa en otra cosa que no sea su propia computadora portátil, nunca use la
endl
declaración. Especialmente si está escribiendo muchas líneas cortas o como he visto caracteres individuales en un archivo. El uso deendl
es saber matar sistemas de archivos en red como NFS.fuente
Con referencia Este es un manipulador de E / S de solo salida .
std::endl
Inserta un carácter de nueva línea en la secuencia de salida os y lo vacía como si llamaraos.put(os.widen('\n'))
seguido deos.flush()
.Cuándo usar:
Este manipulador puede usarse para producir una línea de salida inmediatamente ,
p.ej
también
fuente