Pregunta

¿Hay algún motivo (aparte de los sintácticos) por el que le gustaría utilizar

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 utiliza C en un entorno Linux?

¿Fue útil?

Solución

En primer lugar, no existe una especialmente buena razón para usar fdopen si fopen es una opción y open es la otra opción posible. Usted no debería tener open utiliza para abrir el archivo en el primer lugar si quieres un FILE *. Por lo que incluir fdopen en esa lista es incorrecto y confuso, ya que no es muy parecido a los otros. Ahora procederé a ignorarlo porque la distinción importante aquí es entre un FILE * C estándar y un descriptor de archivo específico del SO.

Hay cuatro razones principales para utilizar en lugar de fopen open.

  1. fopen le proporciona almacenamiento temporal IO que pueden llegar a ser mucho más rápido que lo que está haciendo con open.
  2. fopen hace traducción de final de línea si el archivo no se abre en modo binario, que puede ser muy útil si el programa está siempre portado a un entorno no-Unix.
  3. Una FILE * le da la capacidad de utilizar fscanf y otras funciones stdio.
  4. Su código puede necesitar algún día para ser transferido a otra plataforma que sólo es compatible con ANSI C y no es compatible con la función open.

En mi opinión, el final de línea traducción más a menudo se interpone en su camino que le ayuda, y el análisis de fscanf es tan débil que, inevitablemente, termina la tire a favor de algo más útil.

Y la mayoría de las plataformas que soportan C tienen una función open.

Esto deja la cuestión de amortiguación. En los lugares donde se está leyendo sobre todo si está escribiendo una secuencia de archivos, el apoyo de amortiguación es realmente útil y una gran mejora de velocidad. Pero puede dar lugar a algunos problemas interesantes en los que los datos no termine en el archivo cuando se espera que esté allí. Hay que recordar que fclose o fflush en los momentos adecuados.

Si estás haciendo busca (también conocido como fsetpos o fseek el segundo de los cuales es un poco más difícil de usar de una manera compatible con las normas), la utilidad de búfer va rápidamente hacia abajo.

Por supuesto, mi sesgo es que tiendo a trabajar con tomas mucho, y no el hecho de que realmente desea estar haciendo sin bloqueo IO (que FILE * totalmente no apoya de ninguna manera razonable) sin búfer en absoluto y, a menudo tienen requisitos de análisis complejos realmente colorear mis percepciones.

Otros consejos

open() es una llamada de sistema operativo de bajo nivel. fdopen() convierte un descriptor de archivos a nivel de sistema operativo a la de más alto nivel ARCHIVO-abstracción de la C idioma. fopen() llama open() en el fondo y le da un puntero a fichero directamente.

Hay varias ventajas en el uso de archivos de los objetos descriptores de archivo en lugar primas, que incluye una mayor facilidad de uso, sino también otras ventajas técnicas, como una función de amortiguación. Especialmente el almacenamiento temporal generalmente resulta en una ventaja de rendimiento considerable.

fopen vs abierta en C

1) fopen es un función de biblioteca mientras open es un llamada al sistema .

2) fopen proporciona tamponada IO que es más rápido en comparación con open que es no tamponada .

3) fopen es portátil mientras open no portátil ( abierto es entorno específico ).

4) fopen devuelve un puntero a un estructura de archivos (FILE *) ; open devuelve un entero que identifica el archivo.

5) Un FILE * le da la capacidad de utilizar fscanf y otras funciones stdio.

Si usted tiene un FILE *, puede utilizar funciones como fscanf, fprintf y fgets etc Si usted tiene sólo el descriptor de archivo, usted ha limitado (pero probablemente más rápido) de entrada y de salida rutinas read, write etc.

A menos que sea parte del 0,1% de aplicaciones en las que el uso de open es un beneficio de rendimiento real, realmente no hay una buena razón para no usar fopen. En lo que se refiere a fdopen, si usted no está jugando con los descriptores de archivos, no es necesario que la llamada.

Seguir con fopen y su familia de métodos (fwrite, fread, fprintf, et al) y estará muy satisfecho. Igual de importante, otros programadores estarán satisfechos con su código.

Uso de abrir, leer, escribir significa que usted tiene que preocuparse por interaptions señal.

Si la llamada fue interrumpida por un manejador de señales de las funciones devolverán -1 y errno el valor EINTR.

Así que la forma correcta de cerrar un archivo sería

while (retval = close(fd), retval == -1 && ernno == EINTR) ;

open () será llamado en el extremo de cada uno de los FOPEN) funciones (de la familia. open () es una llamada de sistema y fopen () son proporcionados por bibliotecas como funciones de contenedor para el usuario fácil de uso

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 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 a otros sistemas operativos.Podemos escribir en un puntero de 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);

Depende también de lo que las banderas están obligados a abrir. Con respecto al uso de la escritura y la lectura (y portabilidad) f * se debe utilizar, como se ha señalado anteriormente.

Pero si básicamente desee especificar más de banderas estándar (como rw y anexar banderas), tendrá que utilizar una API de plataforma específica (como POSIX abierta) o una biblioteca que abstrae estos detalles. El C-norma no tiene ningún tipo de banderas.

Por ejemplo, usted podría querer abrir un archivo, sólo si se sale. Si no se especifica la bandera debe existir crear el archivo. Si se agrega exclusiva para crear, sólo se creará el archivo si no existe. Hay muchos más.

Por ejemplo en los sistemas Linux existe una interfaz LED expuesto 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 van 0-255. Por supuesto que no desea crear ese archivo y sólo escribir en él si es que existe. Lo interesante ahora:. Uso fdopen para leer / escribir este archivo usando las llamadas estándar

He cambiado a abrir () desde fopen () para mi aplicación, ya que estaba causando fopen doble lee cada vez que me encontré fgetc fopen. Doble dice estaban perturbador de lo que estaba tratando de lograr. open () sólo parece hacer lo que pides de él.

abrir un archivo usando abrir
Antes de que podamos leer (o escribir) información desde (hacia) un archivo en un disco, debemos abrir el archivo.para abrir el archivo hemos llamado a 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 abrir función
Hay algunas causas durante el proceso de almacenamiento en búfer, es posible que se agote el tiempo de espera.entonces al comparar abrir(E/S de alto nivel) a abierto (E/S de bajo nivel) llamada al sistema, y ​​es más rápido y más apropiado que abrir.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top