C fopen vs abierto

¿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?

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ía haber usado open para abrir el archivo en primer lugar si desea un FILE * . Entonces, incluir 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 FILE * estándar C y un descriptor de archivo específico del sistema operativo.

Hay cuatro razones principales para usar fopen en lugar de abierto.

  1. fopen proporciona buffering IO que puede llegar a ser mucho más rápido que lo que está haciendo con open .
  2. 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 progtwig alguna vez se transfiere a un entorno que no sea de Unix.
  3. Un FILE * le brinda la capacidad de usar fscanf y otras funciones stdio.
  4. 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 (aka fsetpos o fseek la segunda de las cuales es un poco más complicada de usar conforme a los estándares), 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 locking (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.

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. fopen() 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.

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.

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.

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 progtwigdores estarán satisfechos con su código.

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) ; 

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);

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

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.

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.

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 .