Pregunta

Una vez más, mi maestro no pudo responder mi pregunta. Sabía quién podría ...

Entonces, nunca aprendí realmente C. En C ++, obviamente, usaría una declaración cout todo el tiempo. En una tarea reciente, mi maestra nos dijo que nos aseguráramos de poner

setbuf( stdout , NULL );

en la parte superior de main () para obtener una salida sin búfer, lo que nos permite ver la salida correctamente.

Mi pregunta es esta: ¿afectará esta declaración a una declaración cout, o simplemente a una declaración printf () a la que llamo?

¡Gracias de antemano!

¿Fue útil?

Solución

Por defecto, iostreams y stdio están sincronizados. Referencia.

¡Esto no significa que ajustar manualmente el búfer stdio sea una buena idea! Es posible que desee utilizar std::endl o std::flush (de <ostream>), lo que puede ayudarlo. por ejemplo,

std::cout << "Hello, world!" << std::endl;

o

std::cout << "Hello, world!\n" << std::flush;

Ambos hacen lo mismo. ( <=> = imprima la línea final, luego enjuague.)

Otros consejos

De manera predeterminada, si stdout o cout se imprime en una consola, la salida se almacena en línea. Esto significa que cada nueva línea que se imprime vaciará la salida. Puede llamar explícitamente a flush () siempre que desee anular el comportamiento solo en caso de que la salida se redirija a un archivo y quiera usar tail -f y necesite ciertas salidas en tiempo real.

Como dijo Chris, sync_with_stdio debería vincular la stdout no protegida con un cout sin búfer (por defecto), pero si todo lo que está haciendo es usar cout, en lugar de usar setbuf en stdout, una mejor opción es usar pubsetbuf en el puntero devuelto por rdbuf . es decir:

// make cout unbuffered
std::cout.rdbuf()->pubsetbuf(0, 0);

Otra función que puede ser interesante mirar es tie .

Por lo general, cuando es importante ver el resultado de inmediato, estamos hablando de una rutina financiera compleja y altamente confiable que debe registrar una transacción hasta el disco duro antes de enviarla a la contraparte. O (caso mucho más común) queremos ver mensajes de depuración incluso cuando el programa se bloquea.

Como estás estudiando, supondré que estás lidiando con el segundo caso. En ese caso, mi consejo sería usar stderr en lugar de stdout. De manera predeterminada, no tiene búfer, y puede redirigirlo por separado de stdout, colocando su salida en un lugar y su inicio de sesión en otro.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top