Muchos de C++ libros contienen código de ejemplo como este…

std::cout << "Test line" << std::endl;

…así que siempre he hecho demasiado. Pero he visto un montón de código de trabajo a los desarrolladores como este lugar:

std::cout << "Test line\n";

Hay una razón técnica para preferir uno sobre el otro, o es sólo una cuestión de estilo de codificación?

InformationsquelleAutor Head Geek | 2008-10-17

13 Comentarios

  1. 436

    La variable de final de línea que los personajes no importan, suponiendo que el archivo está abierto en modo texto, que es lo que usted consigue, a menos que usted pida binario. El programa compilado escribirá la cosa correcta para el sistema de compilado por.

    La única diferencia es que std::endl vacía el buffer de salida, y '\n' no. Si usted no desea que el búfer se vacían con frecuencia, el uso de '\n'. Si usted (por ejemplo, si usted desea obtener todos los de salida, y el programa es inestable), el uso de std::endl.

    • O considere el uso de ::std::cerr en lugar de ::std::cout ya que es sin búfer y se vacían con cada operación de salida.
    • No std::cerr debe ser reservada para los errores. Las dos corrientes no están sincronizados juntos de modo que si a la salida de texto a cout puede ser amortiguada y la cerr va a ir directo a la salida de esta resultando en un modo mixto de la pantalla. Uso cerr para lo que se supone que debe ser para (errores) y cout para lo que está diseñado para (interacción normal).
    • York, estoy de acuerdo, eso es lo que ::std::cerr es para. Pero, en mi opinión, si tienes el código en el que usted no desea que el búfer es mucho más probable que su salida pertenece en ::std::cerr. Yo no puedo pensar en ninguna buena razón para rutinariamente renunciar el almacenamiento en búfer para ::std::cout.
    • std::endl es la plataforma cuenta también, ¿No?
    • Más que ‘\n’ es la plataforma de conocimiento.
    • Yo no diría stderr es para los «errores». Más bien, es para fuera-de-banda los mensajes de diagnóstico, si se quiere. Debería ser posible decir ./prog > file y almacenar sólo el verdadero programa de la carga, sino que el programa, como a la salida de un montón más de información del estado, incluso en condiciones normales de interacción.
    • «En muchas implementaciones, la salida estándar es la línea de buffer, y la escritura ‘\n’ provoca un vaciado de todos modos, a menos std::cout.sync_with_stdio(falso) fue ejecutado.» copiado de aquí
    • por favor, no poner todo de su salida en cerr. La impresión sólo los errores a cerr permite, a continuación, separe los dos flujos de salida mediante la reorientación de ellos a diferentes lugares. Si me redirigir cerr de salida con 2>/dev/null no quiero tener todos mis regular la salida de desaparecer también. Del mismo modo, si yo redirigir todos mis regular la salida a un archivo como 1>output.txt quiero que todos los de mi salida y no hay errores de estar allí. O si me tubo a grep o more, quiero que el tubo de empuje sobre cout cosas, como era de esperar, y luego de tubería de errores haciendo 3>&1 1>&2 2>&3 | grep Así que por favor, por favor, no los mezcle. Nunca.
    • Una buena razón para rutinariamente renunciar búfer es que usted quiere que su salida esté disponible cuando se escribe en lugar de en algún tiempo indeterminado en el futuro. Pero normalmente, el almacenamiento en búfer a suceder mientras está en el proceso de escritura de un bloque de salida.
    • También hay ostream::ras
    • ‘\n’ también color si la salida está conectada a un dispositivo interactivo, como un terminal.
    • Veo a muchas personas decir «de color» – pero todo lo que ostream::ras que hace es llamar a sync() en la inferior streambuf, por lo que depende totalmente de la streambuf implementación de lo que sucede. Por ejemplo, un fstream utiliza un filebuf, por lo que el efecto es en.cppreference.com/w/cpp/io/basic_filebuf/sync ; También llamada en.cppreference.com/w/cpp/io/ios_base/sync_with_stdio o no, parece bastante importante y nadie (excepto GuLearn) incluso menciona :/

  2. 220

    La diferencia puede ser ilustrado por el siguiente:

    std::cout << std::endl;

    es equivalente a

    std::cout << '\n' << std::flush;

    Así,

    • Uso std::endl Si desea forzar el vaciado a la salida.
    • Uso \n si usted está preocupado por el rendimiento (que probablemente no es el caso si usted está utilizando el << operador).

    Yo uso \n en la mayoría de las líneas.

    A continuación, utilice std::endl al final de un párrafo, sino que es un hábito, y no suele ser necesario).

    Contrario a otros reclamos, la \n personaje se asigna a la plataforma correcta al final de la línea de secuencia sólo si la secuencia se va a un archivo (std::cin y std::cout ser especial, pero todavía los archivos (o archivo-like)).

    • En muchos casos, el «ver el resultado de inmediato» es un arenque rojo, ya que cout está ligado a cin, lo que significa que si usted lee la entrada desde cin, cout se enjuaga primero. Pero si desea mostrar una barra de progreso o algo sin leer de cin, entonces seguro, rubor es útil.
    • usted está utilizando el << operador, usted probablemente no estén preocupados por el rendimiento de – ¿por qué? Yo no sabía que operator<< no es eficiente, o lo que la alternativa a utilizar para el rendimiento? Por favor, me apunte a algún material para entender esto más a fondo.
    • Hay un viejo cuento de que C++ corrientes no son tan eficientes como C printf(). Aunque la verdad hasta cierto punto la principal diferencia en velocidad es causada por personas con C++ arroyos incorrectamente. stackoverflow.com/a/1042121/14065 En C++ recuerde unsync iostreams con C-corrientes – sync_with_stdio(false) y no tire su salida de forma continua. Vamos a la biblioteca cuando hacerlo. stackoverflow.com/a/1926432/14065
    • Hay una leyenda urbana que sync_with_stdio hace iostreams tan rápido como stdio. no
    • Yo era cuidadoso con mi redacción anterior (así que estoy contento con ellos). No es tan eficiente como stdio (ya no más). PERO una gran cantidad de la brecha de rendimiento de personas se quejan de que es la causa por la sincronización con stdio.
  3. 40

    Puede haber problemas de rendimiento, std::endl las fuerzas de un color de la secuencia de salida.

    • Y lo puede hacer cualquier otro tipo de procesamiento que el sistema requiere para hacer que esto funcione bien.
  4. 26

    He recordado leyendo acerca de esto en el estándar, así que aquí va:

    Ver C11 estándar que define cómo los flujos estándar se comportan, como los programas de C++ de la interfaz de la CRT, el C11 estándar debe regir el enrojecimiento de la piel de la política de aquí.

    ISO/IEC 9899:201x

    7.21.3 §7

    Al inicio del programa, tres cadenas de texto están predefinidos y no se abre explícitamente
    — la entrada estándar (para la lectura convencional de entrada), la salida estándar (por escrito
    convencional de salida), y el error estándar (para la escritura de la salida de diagnóstico). Como inicialmente
    abierto, el flujo de error estándar no es de búfer completo; la entrada estándar y estándar
    flujos de salida son de búfer completo si y sólo si el flujo se puede determinar que no se refieren
    para un dispositivo interactivo.

    7.21.3 §3

    Cuando una corriente es sin búfer, los personajes están destinados a aparecer a partir de la fuente o en la
    destino tan pronto como sea posible. De lo contrario, los personajes pueden ser acumulados y
    transmitida hacia o desde el entorno de acogida como un bloque. Cuando una corriente es de búfer completo,
    los personajes están destinados a ser transmitidos a o desde el entorno de acogida como un bloque cuando
    un buffer está lleno. Cuando una corriente es la línea intermedia, los personajes están destinados a ser
    transmitida hacia o desde el entorno de acogida como un bloque cuando una nueva línea de carácter
    encontradas. Además, los personajes están destinados a ser transmitidos como un bloque para el host
    medio ambiente cuando el búfer está lleno, cuando de entrada se solicitará un sin corriente, o
    cuando la entrada se solicitará una línea de secuencia del búfer que requiere la transmisión de
    personajes del entorno de acogida. El apoyo de estas características es
    aplicación definido, y puede ser afectada a través de la setbuf y setvbuf funciones.

    Esto significa que std::cout y std::cin son de búfer completo si y sólo si que se están refiriendo a un no-dispositivo interactivo. En otras palabras, si stdout está conectado a una terminal entonces no hay ninguna diferencia en el comportamiento.

    Sin embargo, si std::cout.sync_with_stdio(false) se llama, entonces '\n' no provocar rubor incluso a dispositivos interactivos. De lo contrario, '\n' es equivalente a std::endl a menos que las tuberías de archivos: c++ ref en std::endl.

  5. 23

    Hay otra llamada a la función implícita en allí si vas a usar std::endl

    a) std::cout << "Hello\n";
    b) std::cout << "Hello" << std::endl;

    a) llamadas operador << una vez.

    b) llamadas de operador << dos veces.

    • Puede ser obvio, pero tiene un enorme impacto en programas con hilos donde, generalmente, la primera versión de escribir una sola línea en un plano donde la segunda versión se puede dividir en escribe desde otros hilos. Bastante a menudo me encuentro escribiendo std::cout << «hola\n» << std::ras para evitar esto.
    • ¿Qué acerca de std::cout << "Hello" << "\n";?
    • Casi el mismo, excepto el tampón de lavado como se describe en otras respuestas. De todos modos, es redundante cuando usted puede combinar las dos literales de cadena en uno.
    • Así, si la cadena a imprimir no es literal, entonces las llamadas a la << sería de 2 en el caso de un, así, yo no reclamo la necesidad de uno o dos << (o dos llamadas a la función en general) una diferencia entre \n y endl.
    • Lol no, no, esa no es la razón por la que utilizo \n.
  6. 18

    Ambos escribir la adecuada al final de la línea de personaje(s). Además de que endl hará que el búfer se ha comprometido. Generalmente usted no desea utilizar endl al hacer e/S de archivos debido a la innecesaria compromete puede afectar al rendimiento.

  7. 9

    Si el uso de Qt y endl, de forma accidental, puede utilizar el mal endl, me pasó a mí el día de hoy y yo estaba como ..WTF ??

    #include <iostream>
    #include <QtCore/QtCore> 
    #include <QtGui/QtGui>
    //notice that i dont have a "using namespace std;"
    int main(int argc, char** argv)
    {
        QApplication qapp(argc,argv);
        QMainWindow mw;
        mw.show();
        std::cout << "Finished Execution !" << endl << "...";
        //Line above printed: "Finished Execution !67006AB4..."
        return qapp.exec();
    }

    De curso que fue mi error, ya que debería haber escrito std::endl, pero si usted utiliza endl, qt y using namespace std; depende del orden de los archivos de inclusión si la correcta endl será utilizado.*

    Por supuesto, usted puede compilar Qt para utilizar un espacio de nombres, por lo que obtiene un error de compilación para el ejemplo anterior.

    EDIT: Olvidé mencionar, Qt endl se declara en «qtextstream.h», que es parte de QtCore

    *EDIT2: C++ se escoge la correcta endl si usted tiene un using para std::cout o el espacio de nombres std, desde std::endl está en el mismo espacio de nombres que std::cout, C++ADL mecanismo de selección std::endl.

    • Urgh! Quien quiera ser using namespace std; ?? 🙂
    • Desagradable. Gracias por el comentario, estoy seguro de que otros se ejecutará en que.
    • Tengo que hacer. ¿Por qué no?
    • Está bien mientras usted no hacerlo en los archivos de encabezado.
    • Por favor, evite using namespace std;. Se considera una mala práctica. Consulte ¿por Qué es «using namespace std;» considera una mala práctica?
  8. 1

    La endl manipulador es equivalente a '\'. Pero endl siempre vacía la corriente.

    std::cout << "Test line" << std::endl; //with flush
    std::cout << "Test line\n"; //no flush
  9. 0

    Con referencia Este es un sólo de salida I/O manipulador.

    std::endl Inserta un carácter de nueva línea en la secuencia de salida os y los colores como si llamando os.put(os.widen('\n')) seguido por os.flush().

    Cuándo usar:

    Este manipulador puede ser utilizado para producir una línea de de salida inmediatamente,

    por ejemplo,

    cuando se muestra la salida de un proceso de larga duración, el registro de la actividad de múltiples hilos o registro de actividad de un programa que puede bloquearse de forma inesperada.

    También

    Un vaciado explícito de std::cout también es necesaria antes de una llamada a std::sistema, si el proceso generado realiza cualquier pantalla I/O. En la mayoría de los otros habitual interactivo de e/S de los escenarios, std::endl es redundante cuando se utiliza con std::cout, ya que cualquier entrada de std::cin, salida a std::cerr, o a la finalización del programa obliga a una llamada a std::cout.flush(). Uso de std::endl en lugar de ‘\n’, alentado por algunas fuentes, puede degradar significativamente el rendimiento de salida.

  10. 0

    Si usted tiene la intención de ejecutar el programa en otra cosa que su propio ordenador portátil, no usar nunca el endl declaración. Especialmente si usted está escribiendo un montón de líneas cortas o como muchas veces he visto a un solo carácter en un archivo. El uso de endl es saber para matar a los sistemas de archivos de red como NFS.

    • Es que debido a la descarga? Puedo ver cómo podría ser posible.
    • De hecho. También he visto de demolición e / s de disco de rendimiento.
  11. -24

    Si no te diste cuenta, endl es como pulsar la TECLA ENTRAR mientras que "\n" es como pulsar la TECLA ENTER + BARRA de ESPACIO.

    • completamente equivocado.
    • esto es una tontería.
    • querido Dios!!! ¿de dónde sacaste eso?
    • En serio, ¿de dónde has escuchado o leído eso?

Dejar respuesta

Please enter your comment!
Please enter your name here