una - incluir librerias propias en c++
¿Setbuf() afecta a cout? (3)
Una vez más, mi maestra no pudo responder mi pregunta. Sabía quién podría ...
Por lo tanto, 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 afirmación a una declaración cout, o simplemente a una declaración printf () a la que llamo?
¡Gracias por adelantado!
De manera predeterminada, si stdout o cout está imprimiendo en una consola, la salida se almacena en línea. Esto significa que cada línea nueva que se imprime vaciará la salida. Puede llamar explícitamente a flush () siempre que desee anular el comportamiento, por si acaso, la salida se redireccionará a un archivo y desea usar tail -f y necesitará ciertas salidas en tiempo real.
Como dijo Chris, sync_with_stdio debe vincular el stdout sin búfer con un comando sin búfer (de forma predeterminada), 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 de ver es el empate .
Generalmente, 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 cuelga.
Ya que estás estudiando, asumiré que estás tratando con el segundo caso. En ese caso, mi consejo sería usar stderr en lugar de stdout. Está sin búfer por defecto, y puede redirigirlo por separado de stdout, colocando su salida en un lugar y su registro en otro.
Por defecto, iostreams y stdio están sincronizados. Referencia.
Sin embargo, esto no significa que ajustar manualmente el almacenamiento intermedio de stdio sea una buena idea. Es posible que desee utilizar std::endl
o std::flush
(de <ostream>
), lo que puede ayudarlo. p.ej,
std::cout << "Hello, world!" << std::endl;
o
std::cout << "Hello, world!/n" << std::flush;
Ambos hacen lo mismo. ( std::endl
= imprimir línea final, luego enjuagar)