¿Hay alguna razón (aparte de las sintácticas) que quiera usar
FILE *fdopen(int fd, const char *mode);
o
FILE *fopen(const char *path, const char *mode);
en vez de
int open(const char *pathname, int flags, mode_t mode);
cuando se usa C en un entorno Linux?
fdopen
yopen
o ofopen
yopen
?fopen
es parte de la biblioteca estándar de C,open
no lo es. Úselofopen
al escribir código portátil.open
es una función POSIX.Respuestas:
Primero, no hay una razón particularmente buena para usar
fdopen
sifopen
es una opción yopen
es la otra opción posible. Enopen
primer lugar , no debería haber usado para abrir el archivo si desea unFILE *
. Por lo tanto, incluirlofdopen
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 CFILE *
y un descriptor de archivo específico del sistema operativo.Hay cuatro razones principales para usar en
fopen
lugar deopen
.fopen
le proporciona IO de almacenamiento en búfer que puede resultar mucho más rápido de lo que está haciendoopen
.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)).FILE *
le brinda la capacidad de usarfscanf
y otras funciones estándar.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
offlush
en los momentos apropiados.Si está haciendo búsquedas (alias
fsetpos
ofseek
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.fuente
fgets
,fgetc
,fscanf
,fread
), siempre leer el tamaño de la memoria intermedia (4K, 8K o cualquier cosa que se). Al usar la E / S directa puede evitar eso. En ese caso, es incluso mejor usar enpread
lugar de un par de búsqueda / lectura (1 syscall en lugar de 2).read()
y laswrite()
llamadas es una quinta razón conveniente para usar la familia de funciones libc.ioctl
también admiten lafileno
llamada que toma unFILE *
y devuelve un número que se puede usar en unaioctl
llamada. Pero ten cuidado.FILE *
las llamadas relacionadas pueden interactuar sorprendentemente con el usoioctl
para cambiar algo sobre el descriptor de archivo subyacente.open()
es una llamada de bajo nivel del sistema operativo.fdopen()
convierte un descriptor de archivo de nivel os en la abstracción de ARCHIVO de nivel superior del lenguaje C.fopen()
llamaopen()
en segundo plano y te da un puntero de ARCHIVO directamente.Existen varias ventajas al usar objetos FILE en lugar de descriptores de archivos sin formato, 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 da como resultado una ventaja de rendimiento considerable.
fuente
fopen()
no proporciona el mismo nivel de control al abrir archivos, por ejemplo, crear permisos, modos de compartir y más. Por lo general, lasopen()
variantes proporcionan mucho más control, cerca de lo que realmente proporciona el sistema operativommap
el archivo y los cambios se realizan con E / S normales (por increíble que parezca que en realidad lo hacemos en nuestro proyecto y por razones realmente buenas), el almacenamiento en búfer estaría en el camino.fopen vs abierto en C
1)
fopen
es una función de biblioteca mientras queopen
es una llamada al sistema .2)
fopen
proporciona IO con buffer que es más rápido en comparación con elopen
que no tiene buffer .3)
fopen
es portátil mientras queopen
no es portátil ( abierto es específico del entorno ).4)
fopen
devuelve un puntero a una estructura FILE (FILE *) ;open
devuelve un entero que identifica el archivo.5) A
FILE *
le brinda la capacidad de usar fscanf y otras funciones estándar.fuente
open
es un estándar POSIX, por lo que es bastante portátilA menos que forme parte del 0.1% de las aplicaciones en las que el uso
open
es un beneficio de rendimiento real, realmente no hay una buena razón para no usarlofopen
. En lo que a élfdopen
respecta, si no estás jugando con descriptores de archivos, no necesitas esa llamada.Palo con el
fopen
y su familia de métodos (fwrite
,fread
,fprintf
, y otros) y se le muy satisfecho. Igual de importante, otros programadores estarán satisfechos con su código.fuente
Si usted tiene una
FILE *
, puede utilizar funciones comofscanf
,fprintf
yfgets
etc Si usted tiene sólo el descriptor de archivo, usted ha limitado (pero probablemente más rápido) de entrada y salida rutinasread
,write
etc.fuente
El uso de abrir, leer y escribir significa que debe preocuparse por las interacciones de señal.
Si la llamada fue interrumpida por un controlador de señal, las funciones devolverán -1 y establecerán errno en EINTR.
Entonces, la forma correcta de cerrar un archivo sería
fuente
close
, esto depende del sistema operativo. Es incorrecto hacer el bucle en Linux, AIX y algunos otros sistemas operativos.open()
es una llamada al sistema y específica de los sistemas basados en Unix y devuelve un descriptor de archivo. Puede escribir en un descriptor de archivo utilizandowrite()
otra llamada del sistema.fopen()
es una llamada de función ANSI C que devuelve un puntero de archivo y es portátil a otros sistemas operativos. Podemos escribir en un puntero de archivo usandofprintf
.En Unix:
puede obtener un puntero de archivo desde el descriptor de archivo usando:
Puede obtener un descriptor de archivo desde el puntero del archivo usando:
fuente
Se llamará a open () al final de cada una de las funciones de la familia fopen () . open () es una llamada al sistema y las bibliotecas proporcionan fopen () como funciones envolventes para un usuario fácil de usar
fuente
Cambié a open () desde fopen () para mi aplicación, porque fopen estaba causando lecturas dobles cada vez que ejecutaba fopen fgetc. Las lecturas dobles fueron perjudiciales para lo que estaba tratando de lograr. open () parece hacer lo que le pides.
fuente
Depende también de qué banderas se requieren para abrir. Con respecto al uso para escribir y leer (y portabilidad) se debe usar f *, como se argumentó anteriormente.
Pero si básicamente desea especificar más que banderas estándar (como rw y agregar banderas), tendrá que usar una API específica de la plataforma (como POSIX abierto) o una biblioteca que abstraiga estos detalles. El estándar C no tiene tales banderas.
Por ejemplo, es posible que desee abrir un archivo, solo si sale. Si no especifica la marca de creación, el archivo debe existir. Si agrega exclusivo para crear, solo creará el archivo si no existe. Hay muchos más.
Por ejemplo, en sistemas Linux hay una interfaz LED expuesta a través de sysfs. Expone el brillo del led a través de un archivo. Escribir o leer un número como una cadena que va de 0 a 255. Por supuesto, no desea crear ese archivo y solo escribir en él si existe. Lo bueno ahora: usa fdopen para leer / escribir este archivo usando las llamadas estándar.
fuente
Al abrir un archivo usando fopen
antes de que podamos leer (o escribir) información de (a) un archivo en un disco, debemos abrir el archivo. para abrir el archivo hemos llamado a la función fopen.
Esta es la forma de comportamiento de la función fopen .
Hay algunas causas durante el proceso de almacenamiento en búfer, puede agotar el tiempo de espera. así que, al comparar fopen ( E / S de alto nivel) con la llamada al sistema abierto (E / S de bajo nivel), es más rápido y apropiado que fopen .
fuente