comando - stdout y necesidad de limpiarlo C++
cout flush c++ (7)
Tengo algún código C ++ que usa sentencias cout para fines de depuración y, por alguna razón, no puedo imprimir todos los datos a menos que haga un std::cout.flush(); al final.
No entiendo muy bien por qué es necesaria esta operación de descarga.
¿Alguien tiene alguna idea?
"Cuando envía una salida a un flujo, no necesariamente se imprime inmediatamente. Más bien, puede esperar en un búfer hasta que ocurra algún evento no especificado, por ejemplo, un búfer lo suficientemente lleno, lectura desde la entrada o salida del programa. Los detalles pueden variar".
http://www.cs.hmc.edu/~geoff/classes/hmc.cs070.200109/notes/io.html
¿Estás usando std::endl para terminar tus líneas? Esta debería ser la práctica habitual, hasta que los problemas de rendimiento requieran lo contrario, pero por alguna razón, veo mucho código que usa ''/n'' lugar.
De lo contrario, siempre puedes hacer:
std::cout.setf( std::ios_base::unitbuf );
Como una de las primeras cosas en main . Esto provocará una descarga al final de cada << , que es más de lo que necesita, pero para la salida de diagnóstico a la consola, es probablemente bastante aceptable.
¿Los datos que no se están vaciando automáticamente carecen de un /n al final? De forma predeterminada, la salida estándar no se entrega hasta que se ve un retorno de carro.
En C ++ puede usar el formateador endl con el operador cout lugar de flush .
Es el comportamiento correcto. Probablemente use std::endl que agrega /n y std::endl el búfer. http://www.cplusplus.com/reference/ostream/endl/
Necesitas vaciar la corriente si quieres ver la salida.
La respuesta de std::endl solo es válida si desea una devolución. No estoy seguro de cómo haría esto si quisiera eliminar un indicador de comandos.
Para agregar a las otras respuestas: sus declaraciones de depuración deben ir a cerr , porque:
- escribe en el error estándar, lo que significa que, al ejecutar la aplicación, puede separar fácilmente la salida del programa "normal" de la información de errores / depuración a través de la redirección;
- lo más importante es que la
cerrpor defecto no tiene búfer , lo que significa que, después de cada operación de salida, secerrautomáticamente y, en general, esto es deseable para los errores y la salida de depuración.
(fuente: estándar de C ++, §27.3.1 ¶4-5, §27.4.2.1.2 tabla 83)