Pregunta

Quiero saber la diferencia entre un descriptor de archivo y un puntero de archivo.

Además, ¿en qué escenario usarías uno en lugar del otro?

¿Fue útil?

Solución

Un descriptor de archivo es un número entero de bajo nivel "manejar" se utiliza para identificar un archivo abierto (o zócalo, o lo que sea) a nivel de núcleo, en Linux y otros sistemas Unix.

Se pasa "desnudos" descriptores de fichero a Unix real llama, como read(), write() y así sucesivamente.

Un puntero FILE es un constructo de nivel de biblioteca estándar C, que se utiliza para representar un archivo. El FILE envuelve el descriptor de archivo y añade tampón y otras características para hacer de E / S más fácil.

Se pasa punteros FILE a las funciones estándar de C, tales como fread() y fwrite().

Otros consejos

Uno está tamponada (FILE *) y el otro no lo es. En la práctica, desea utilizar FILE * casi siempre cuando se está leyendo desde un archivo 'real' (es decir. En la unidad), a menos que sepa lo que está haciendo o menos que su archivo es en realidad una toma más o menos ..

Usted puede obtener el descriptor de archivo de la FILE * usando fileno() y se puede abrir una FILE * tamponada de un descriptor de archivo usando fdopen()

Un descriptor de archivo es sólo un número entero que puede obtener de open()call Estas clases'. Utilizando el fopen() C estándar se obtiene una vuelta FILE estructura. La estructura FILE contiene el descriptor de este archivo, entre otras cosas, como al final de su archivo y el indicador de error, etc. posición corriente.

Así que usando fopen() le da una cierta cantidad de abstracción en comparación con open(). En general, usted debe estar utilizando fopen() ya que es más portátil y se puede utilizar todas las otras funciones C estándar que utiliza la estructura FILE, es decir fprintf() y la familia.

No hay problemas de rendimiento utilizando o.

Descriptor de archivo vs puntero de archivo

Descriptor de archivo:

El descriptor de archivo es un valor entero devuelto por open() llamada al sistema.

int fd = open (filePath, mode);

  1. Controlador de nivel bajo/kernel.
  2. pase a leer() y escribir() de llamadas al sistema UNIX.
  3. No incluye almacenamiento en búfer y características similares.
  4. Menos portátil y carece de eficiencia.

Puntero de archivo:

File Pointer es un puntero a una estructura C devuelta por fopen() función de biblioteca, que se utiliza para identificar un archivo, empaquetar el descriptor del archivo, funcionalidad de almacenamiento en búfer y todas las demás funciones necesarias para la operación de E/S.El puntero del archivo es de tipo ARCHIVO, cuya definición se puede encontrar en "/usr/include/stdio.h".Esta definición puede variar de un compilador a otro.

FILE *fp = fopen (filePath, mode);

// A FILE Structure returned by fopen 
    typedef struct 
    {
        unsigned char   *_ptr;
        int     _cnt;
        unsigned char   *_base;
        unsigned char   *_bufendp;
        short   _flag;
        short   _file;
        int     __stdioid;
        char    *__newbase;
#ifdef _THREAD_SAFE
        void *_lock;
#else
        long    _unused[1];
#endif
#ifdef __64BIT__
        long    _unused1[4];
#endif /* __64BIT__ */
    } FILE;
  1. Es una interfaz de alto nivel.
  2. Pasado a las funciones fread() y fwrite().
  3. Incluye almacenamiento en búfer, indicación de error y detección de EOF, etc.
  4. Proporciona mayor portabilidad y eficiencia.

¿Quieres añadir puntos que podrían ser útiles.

SOBRE FILE *

  1. no puede ser utilizado para la comunicación entre procesos (IPC).
  2. usarla cuando necesite genral propósito búfer de E / S. (Printf, frpintf, snprintf, scanf)
  3. Lo utilizo muchas veces para los registros de depuración. ejemplo,

                 FILE *fp;
                 fp = fopen("debug.txt","a");
                 fprintf(fp,"I have reached till this point");
                 fclose(fp);
    

SOBRE FILE DESCRIPTOR

  1. Es generalmente utilizado para IPC.

  2. da un control de bajo nivel a archivos en sistemas * nix. (Dispositivos, archivos, tomas de corriente, etc), por lo tanto más potente que el FILE *.

FILE * es más útil cuando se trabaja con archivos de texto y de usuario de entrada / salida, ya que permite el uso de funciones de la API como sprintf(), sscanf(), fgets(), feof() etc.

API descriptor de archivo es de bajo nivel, lo que permite trabajar con tomas de corriente, tuberías, archivos mapeados en memoria (y archivos normales, por supuesto).

Sólo una nota para terminar la discusión (si está interesado) ....

fopen puede ser inseguro, y que es mejor usar fopen_s o open con trozos exclusivos establecidos. C1X está ofreciendo modos x, por lo que puede fopen con los modos "rx", "wx", etc.

Si utiliza open, es posible considerar open(..., O_EXCL | O_RDONLY,... ) o open(..., O_CREAT | O_EXCL | O_WRONLY,... ).

Véase, por ejemplo, no haga suposiciones acerca de fopen () y la creación del archivo .

Las llamadas al sistema son en su mayoría utilizando el descriptor de archivo, por ejemplo read y write. función de la biblioteca utilizará los punteros de archivo (printf, scanf). Pero, funciones de biblioteca están utilizando internamente sistema llama solamente.

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