2011-06-02 12 views
10

Tengo un código C++ que usa cout declaraciones para depuración y por alguna razón no puedo obtener todos los datos para imprimir a menos que haga un std::cout.flush(); al final.stdout y necesito enjuagarlo C++

yo no entiendo muy bien por qué es necesaria esta operación de vaciado.

¿Alguien tiene alguna idea?

+0

Por favor, no edite mis preguntas, gracias. –

Respuesta

7

Para añadir a las otras respuestas: sus estados de depuración lugar deben ir a cerr, porque:

  • se escribe en el error estándar, lo que significa que, de ejecutar la aplicación, se puede separar fácilmente el "normal "salida del programa de los errores/información de depuración a través de la redirección;
  • más importante, cerr por defecto es sin búfer, lo que significa que, después de cada operación de salida, que hará que se vacíe automáticamente a sí mismo, y en general esto es deseable para errores y salida de depuración.

(fuente: C++ estándar, §27.3.1 ¶4-5, §27.4.2.1.2 tabla 83)

+0

Gracias, lo recordaré para referencia futura, normalmente no me importa ya que eliminaré mis declaraciones de cout pero este proyecto ha sido un dolor real. Odio el código de terceros. –

4

¿Los datos que no se descargan automáticamente carecen de \n al final? Por defecto, la salida estándar no se entrega hasta que se ve un retorno de carro.

+0

Si envío un endl también se imprimirá, pero pensé en C++ que es lo mismo que una operación de descarga? –

+0

El retorno de carro se usa como un "punto de descarga", si lo desea. Tenga en cuenta que C comparte la misma E/S subyacente que C++ y C carece de endl, sin embargo, el \ n aún funciona. std :: endl puede de hecho forzar el color; Tendría que examinar su implementación (o saber de alguien que sí) para estar seguro. – mah

+1

Esto está mal. La salida estándar es * no * almacenada en la línea. Donde está involucrado el almacenamiento en búfer, 'iostream' funciona de manera considerablemente diferente que' FILE'. 'std :: cout' será eliminado por una llamada explícita a' flush' (incluido el desencadenado por 'std :: endl' o por una lectura en' std :: cin'), o en otros momentos no especificados decididos por la implementación . No hay memoria de línea en 'iostream'. –

1

"Cuando envía salida a una secuencia, no necesariamente se imprime inmediatamente. Más bien, puede esperar en un búfer hasta algún evento no especificado, por ejemplo, memoria suficiente, leer desde la entrada o salir del programa. puede variar."

http://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200109/notes/io.html

+0

¿Esto significa que la salida puede ser impredecible y realmente no tengo un error o punto muerto en la transmisión? –

+0

Exactamente a la derecha. Enjuague para una previsibilidad completa. :) –

0

En C++ puede usar el formateador endl con el operador cout en lugar de flush.

9

¿Está utilizando std::endl para terminar sus líneas. Esta debe ser la práctica habitual, hasta que los problemas de rendimiento que requiera otra cosa, pero por alguna razón , veo un montón de código que utiliza '\n' lugar.

De lo contrario, siempre se puede hacer:

std::cout.setf(std::ios_base::unitbuf); 

como una de las primeras cosas en main. Esto hará que una escalera de color al final de cada <<, que es más de lo necesario, pero para diagnóstico salida en la consola, es probablemente bastante aceptable.

+0

Sí, lo hago como un hábito, pero parte del código que estoy integrando no lo hace y es bastante grande para mí "corregirlo" .. –

+0

@Dixon Steel Conozco la sensación. Es por eso que ofrecí la segunda sugerencia, usando 'unitbuf'. –

0

La respuesta de std::endl solo es válida si desea una devolución. No estoy seguro de cómo lo haría si quisiera eliminar un mensaje del comando.