¿Por qué siempre se requiere fseek o fflush entre leer y escribir en los modos de actualización?

P: Estoy intentando actualizar un archivo en su lugar, usando el modo fopen "r+" , leyendo una cierta cadena y escribiendo una cadena modificada, pero no está funcionando.

R: Asegúrate de llamar a fseek antes de escribir, tanto para volver al principio de la cadena que intentas sobrescribir, como siempre se requiere fseek o fflush entre leer y escribir en los modos de lectura / escritura “+” .

Mi pregunta es por qué siempre se requiere fseek o fflush entre leer y escribir en los modos de lectura / escritura “+”. La sección 5.2 de C trampas y trampas (1989) de Andrew Koenig mencionó que se debe a un problema de compatibilidad con versiones anteriores. ¿Alguien puede explicar en detalle?

La biblioteca almacena las operaciones de entrada y salida. Mira los parámetros setvbuf () y _IOFBF, _IOLBF para ese funktion. fseek () o fflush () requieren que la biblioteca confirme operaciones almacenadas. El estándar especifica una operación de búsqueda o descarga como obligatoria para permitir a la biblioteca algunos accesos directos; de lo contrario, para cada operación de E / S, la lib debería verificar si la operación anterior también fue una operación de lectura (o una operación de escritura), y desencadenar una descarga por sí misma si la “dirección” de la E / S cambiaba.

Porque mantiene el código OS / library más simple. Una secuencia de archivos puede tener búferes de lectura y escritura separados, y se requerirá un esfuerzo adicional para asegurarse de que siempre estén sincronizados. Esto costaría rendimiento en momentos en que no era necesario.

Entonces, en cambio, el progtwigdor debe hacer esto explícitamente cuando sea necesario.

Lea ” The Standard C Library ” de Plauger para conocer algunas de las razones por las que varias características de la biblioteca estándar (C89) son como son, y en particular por qué partes de la biblioteca de E / S estándar son como son. Una razón es que C se ejecuta en sistemas muy diversos y con diversos medios; dispositivos como las cintas bien pueden necesitar ser manejados de forma diferente a la unidad de disco en la que estás acostumbrado a pensar. Además, en Unix, considere su dispositivo ‘tty’, que conecta un teclado y un mouse a una pantalla, tres partes de hardware bastante diferentes. Coordinar entre ellos es bastante complicado; las reglas en el estándar lo hacen más fácil.


Tenga en cuenta que el estándar exige esto. Esto es del estándar C11, ISO / IEC 9899: 2011, pero la redacción fue similar en ediciones anteriores:

§7.21.5.3 La función fopen

¶7 Cuando se abre un archivo con modo de actualización (‘+’ como segundo o tercer carácter en la lista anterior de valores de argumento de modo), tanto la entrada como la salida pueden realizarse en la secuencia asociada. Sin embargo, la salida no debe seguirse directamente de la entrada sin una llamada intermedia a la función fflush o a una función de posicionamiento de archivos ( fseek , fsetpos o rewind ), y la entrada no debe seguirse directamente de la salida sin una llamada fsetpos a un archivo función, a menos que la operación de entrada encuentre fin de archivo. Abrir (o crear) un archivo de texto con modo de actualización puede abrir (o crear) una secuencia binaria en algunas implementaciones.