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. No deberías haber usado open
para abrir el archivo en primer lugar si desea un FILE *
. Así que incluye fdopen
en esa lista es incorrecta y confusa porque no se parece mucho a las 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 fopen
en lugar de open
.
fopen
le proporciona E/S de almacenamiento en búfer que puede resultar mucho más rápido que lo que está haciendo conopen
.fopen
hace 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 es de Unix (aunque el mundo parece estar convergiendo solo en LF (excepto las redes basadas en texto de IETF protocolos como SMTP y HTTP y similares)).- A
FILE *
te da la posibilidad de usarfscanf
y otras funciones de stdio. - Es posible que algún día su código deba ser portado a alguna otra plataforma que solo admita ANSI C y no admita el
open
función.
En mi opinión, la traducción del final de línea se interpone más en tu camino que lo que te ayuda, y el análisis de fscanf
es tan débil que inevitablemente terminas descartándolo en favor de algo más útil.
Y la mayoría de las plataformas que admiten C tienen un open
función.
Eso deja la cuestión del almacenamiento en búfer. En lugares donde principalmente está leyendo o escribiendo un archivo secuencialmente, el soporte de almacenamiento en búfer es realmente útil y una gran mejora de la velocidad. Pero puede generar algunos problemas interesantes en los que los datos no terminan en el archivo cuando se espera que estén allí. Tienes que recordar fclose
o fflush
en los momentos apropiados.
Si estás haciendo búsquedas (también conocido como fsetpos
o fseek
el segundo de los cuales es un poco más complicado de usar de una manera compatible con los estándares), la utilidad del almacenamiento en búfer disminuye rápidamente.
Por supuesto, mi tendencia es que tiendo a trabajar mucho con sockets, y ahí está el hecho de que realmente quieres hacer E/S sin bloqueo (que FILE *
falla por completo en brindar soporte de una manera razonable) sin almacenamiento en búfer y, a menudo, tiene requisitos de análisis complejos que realmente colorean mis percepciones.
fopen vs abierto en C
1) fopen
es una función de biblioteca mientras open
es una llamada al sistema .
2) fopen
proporciona IO con búfer que es más rápido en comparación con open
que es no almacenado en búfer .
3) fopen
es portátil mientras open
no portátil (abierto es específico del entorno ).
4) fopen
devuelve un puntero a una estructura de ARCHIVO (ARCHIVO *); open
devuelve un entero que identifica el archivo.
5) Un FILE *
le da la posibilidad de utilizar fscanf y otras funciones de estudio.
open()
es una llamada al sistema operativo de bajo nivel. fdopen()
convierte un descriptor de archivo de nivel de sistema operativo en la abstracción de ARCHIVO de nivel superior del lenguaje C. fopen()
llamadas open()
en el fondo y le da un puntero de ARCHIVO directamente.
Hay varias ventajas en el uso de objetos FILE en lugar de descriptores de archivos sin procesar, que incluyen una mayor facilidad de uso pero también otras ventajas técnicas, como el almacenamiento en búfer incorporado. Especialmente el almacenamiento en búfer generalmente resulta en una ventaja de rendimiento considerable.