c - fopen_s - fread
C fopen vs abierto (11)
¿Hay alguna razón (aparte de las sintácticas) que quieras usar
FILE *fdopen(int fd, const char *mode);
o
FILE *fopen(const char *path, const char *mode);
en lugar de
int open(const char *pathname, int flags, mode_t mode);
cuando se usa C en un entorno Linux?
A menos que sea parte del 0.1% de las aplicaciones en las que usar open
es un beneficio de rendimiento real, realmente no hay una buena razón para no usar fopen
. En lo que respecta a fdopen
, si no está jugando con los descriptores de archivos, no necesita esa llamada.
Quédese con fopen
y su familia de métodos ( fwrite
, fread
, fprintf
, et al) y estará muy satisfecho. Igualmente importante, otros programadores estarán satisfechos con su código.
Cambié a open () desde fopen () para mi aplicación, porque fopen causaba 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.
Depende también de qué banderas se requieren para abrir. Con respecto al uso de escritura y lectura (y portabilidad) se debe usar f *, como se argumentó anteriormente.
Pero si básicamente desea especificar más que los indicadores estándar (como rw y los indicadores de adición), deberá usar una API específica de la plataforma (como POSIX open) o una biblioteca que abstraiga estos detalles. El C-estándar no tiene tales banderas.
Por ejemplo, es posible que desee abrir un archivo, solo si se cierra. 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 de 0-255. Por supuesto, no desea crear ese archivo y solo escribirlo, si existe. Lo bueno de ahora es: use fdopen para leer / escribir este archivo usando las llamadas estándar.
Hay cuatro razones principales para usar fopen en lugar de abierto.
-
fopen
proporciona buffering IO que puede llegar a ser mucho más rápido que lo que está haciendo conopen
. -
fopen
hace una 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 de Unix. - Un
FILE *
le brinda la capacidad de usarfscanf
y otras funciones stdio. - Es posible que su código deba ser transferido algún día a alguna otra plataforma que solo admita ANSI C y no admita la función de
open
.
En mi opinión, la traducción de final de línea más a menudo se interpone en tu camino que ayuda, y el análisis sintáctico de fscanf es tan débil que inevitablemente terminas lanzándolo en favor de algo más útil.
Y la mayoría de las plataformas que admiten C tienen una función open
.
Eso deja la pregunta de amortiguación. En los lugares en los que principalmente lee o escribe un archivo secuencialmente, la compatibilidad con el almacenamiento en búfer es realmente útil y mejora la velocidad. Pero puede llevar a algunos problemas interesantes en los que los datos no terminan en el archivo cuando espera que estén allí. fclose
recordar fclose
o fflush
en los momentos apropiados.
Si está haciendo búsquedas, la utilidad del almacenamiento en memoria intermedia disminuye rápidamente.
Por supuesto, mi prejuicio es que tiendo a trabajar con sockets mucho, y ahí el hecho de que realmente quieres estar haciendo IO sin bloqueo (que FILE *
no admite en absoluto de forma razonable) sin búfer en absoluto y a menudo tienen requisitos de análisis complejos que realmente colorean mis percepciones.
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 de contenedor para el usuario, fáciles de usar
Si tiene un FILE *
, puede usar funciones como fscanf
, fprintf
y fgets
etc. Si solo tiene el descriptor de archivo, tiene rutinas de entrada y salida limitadas (pero probablemente más rápidas) de read
, write
, etc.
Usar abrir, leer, escribir significa que debes preocuparte por las interacciones de señal.
Si la llamada fue interrumpida por un manejador de señal, las funciones devolverán -1 y establecerán errno en EINTR.
Entonces, la forma correcta de cerrar un archivo sería
while (retval = close(fd), retval == -1 && ernno == EINTR) ;
abriendo 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 que hemos llamado la función fopen.
1.firstly it searches on the disk the file to be opened.
2.then it loads the file from the disk into a place in memory called buffer.
3.it sets up a character pointer that points to the first character of the buffer.
esta es la forma de comportamiento de la función fopen
hay algunas causas durante el proceso de almacenamiento en búfer, puede exceder el tiempo de espera. por lo tanto, al comparar fopen (alto nivel de E / S) para abrir (nivel bajo de I / o) la llamada al sistema, y es más rápido más apropiado que fopen .
open()
es una llamada de sistema operativo de bajo nivel. fdopen()
convierte un descriptor de archivo de nivel de os a la abstracción de ARCHIVO de nivel superior del lenguaje C. fdopen() llama a open()
en segundo plano y le proporciona un puntero ARCHIVO directamente.
El uso de objetos FILE tiene varias ventajas, 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 resulta en una ventaja de rendimiento considerable.
open()
es una llamada al sistema y específica para el sistema basado en Unix y devuelve un descriptor de archivo. Puede escribir en un descriptor de archivo usando write()
que es otra llamada al sistema.
fopen()
es una llamada de función ANSI C que devuelve un puntero de archivo y es portátil para otros sistemas operativos. Podemos escribir en el puntero del archivo usando fprintf
.
En Unix:
Puede obtener un puntero de archivo desde el descriptor de archivo usando:
fP = fdopen(fD, "a");
Puede obtener un descriptor de archivo desde el puntero del archivo usando:
fD = fileno (fP);
fopen vs abierto en C
1) fopen
es una función de biblioteca mientras está 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 no está protegido .
3) fopen
es portátil mientras open
no portátil ( abierto es específico del entorno ).
4) fopen
devuelve un puntero a una estructura FILE (FILE *) ; open
devuelve un número entero que identifica el archivo.
5) Un FILE *
le brinda la capacidad de usar fscanf y otras funciones stdio.