Primero, no hay una razón particularmente buena para usar fdopen
si fopen
es una opción y open
es la otra opción posible. En open
primer lugar , no debería haber usado para abrir el archivo si desea un FILE *
. Por lo tanto, incluirlo fdopen
en esa lista es incorrecto y confuso porque no se parece mucho a los demás. Ahora procederé a ignorarlo porque la distinción importante aquí es entre un estándar C FILE *
y un descriptor de archivo específico del sistema operativo.
Hay cuatro razones principales para usar en fopen
lugar de open
.
fopen
le proporciona IO de almacenamiento en búfer que puede resultar mucho más rápido de lo que está haciendo open
.
fopen
realiza la traducción de final de línea si el archivo no se abre en modo binario, lo que puede ser muy útil si su programa alguna vez se transfiere a un entorno que no sea Unix (aunque el mundo parece converger solo en LF (excepto la red basada en texto IETF) protocolos como SMTP y HTTP y tal)).
- A
FILE *
le brinda la capacidad de usar fscanf
y otras funciones estándar.
- Es posible que algún día sea necesario portar su código a otra plataforma que solo sea compatible con ANSI C y no sea compatible con la
open
función.
En mi opinión, la traducción de final de línea se interpone en su camino más de lo que lo ayuda, y el análisis fscanf
es tan débil que inevitablemente termina desechando a favor de algo más útil.
Y la mayoría de las plataformas que admiten C tienen una open
función.
Eso deja la pregunta de amortiguación. En lugares donde está leyendo o escribiendo un archivo principalmente de forma secuencial, el soporte de almacenamiento en búfer es realmente útil y una gran mejora de la velocidad. Pero puede conducir a algunos problemas interesantes en los que los datos no terminan en el archivo cuando espera que estén allí. Tienes que recordar fclose
o fflush
en los momentos apropiados.
Si está haciendo búsquedas (alias fsetpos
o fseek
la segunda de las cuales es un poco más difícil de usar de una manera que cumple con los estándares), la utilidad del almacenamiento en búfer disminuye rápidamente.
Por supuesto, mi sesgo es que tiendo a trabajar mucho con sockets, y existe el hecho de que realmente quieres estar haciendo IO sin bloqueo (que FILE *
no es compatible de ninguna manera razonable) sin ningún buffering y a menudo Tengo requisitos de análisis complejos que realmente colorean mis percepciones.
fdopen
yopen
o ofopen
yopen
?