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
cerr
por defecto no tiene búfer , lo que significa que, después de cada operación de salida, secerr
automá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)