¿Cuál es la diferencia entre un descriptor de archivo y un puntero de archivo?
-
19-09-2019 - |
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?
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);
- Controlador de nivel bajo/kernel.
- pase a leer() y escribir() de llamadas al sistema UNIX.
- No incluye almacenamiento en búfer y características similares.
- 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;
- Es una interfaz de alto nivel.
- Pasado a las funciones fread() y fwrite().
- Incluye almacenamiento en búfer, indicación de error y detección de EOF, etc.
- Proporciona mayor portabilidad y eficiencia.
¿Quieres añadir puntos que podrían ser útiles.
SOBRE FILE *
- no puede ser utilizado para la comunicación entre procesos (IPC).
- usarla cuando necesite genral propósito búfer de E / S. (Printf, frpintf, snprintf, scanf)
-
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
-
Es generalmente utilizado para IPC.
-
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.