Como hacer fprintf () escribe inmediatamente.

Una forma de escribir en un archivo es usando fprintf() . Sin embargo, esta función no escribe los resultados en un archivo inmediatamente . Más bien parece escribir todo a la vez cuando el progtwig se termina o termina.

Mi pregunta es la siguiente: Tengo un progtwig que tarda mucho tiempo en ejecutarse (4-5 horas para un gran conjunto de datos). Durante este tiempo, quiero ver los resultados intermedios para no tener que esperar 5 horas. Mi universidad usa Sun Grid Engine para enviar trabajos. Como la mayoría de ustedes saben, tiene que esperar hasta que finalice su trabajo para ver sus resultados finales. Por lo tanto, quiero poder escribir los resultados intermedios en un archivo de texto y ver los resultados actualizados a medida que el progtwig se está procesando (de manera similar, si estoy usando printf ).

¿Cómo puedo modificar fprintf() para escribir todo lo que quiero inmediatamente en el archivo de destino?

Puede usar la función fflush después de cada escritura para vaciar el búfer de salida al disco.

 fprintf(fileptr, "writing to file\n"); fflush(fileptr); 

Si está en un sistema POSIX (es decir, Linux, BSD, etc.), y realmente desea asegurarse de que el archivo esté escrito en el disco, es decir, desea vaciar los búferes del kernel así como los búferes del espacio del usuario, también use fsync :

 fsync(fileno(fileptr)); 

Pero fflush debería ser suficiente. No se moleste con fsync menos que encuentre que necesita hacerlo.

Tal vez usted puede configurar el puntero de ARCHIVO modo _IONBF. Entonces usted no utiliza la nube fflush o fsync. ARCHIVO * pFilePointor = fopen (…); setvbuf (pFilePointor, NULL, _IONBF, 0);

fprintf (…) fprintf (…)

fflush
Esto funciona en FILE *. Para su caso se ve más apropiado. Tenga en cuenta que fflush (NULL) actualizará todos los archivos / transmisiones abiertos y haré un uso intensivo de la CPU. Es posible que desee utilizar / evitar fflush (NULL) por motivos de rendimiento.

fsync
Esto funciona en int descriptor. No solo actualiza el archivo / flujo, también los metadatos. Puede funcionar incluso en casos de locking / reinicio del sistema también. Puedes consultar la página del manual para más detalles.

Personalmente uso fflush , y funciona bien para mí (en Ubuntu / Linux).