txt lenguaje leer guardar ejercicios descriptores datos binarios archivos archivo c file-descriptor file-pointer

leer - ejercicios de archivos en lenguaje c



¿Cuál es la diferencia entre un descriptor de archivo y un puntero de archivo? (9)

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?


Desea agregar puntos que pueden ser útiles.

ACERCA DEL FILE *

  1. no se puede usar para la comunicación entre procesos (IPC).
  2. úsalo cuando necesites una E / S con búfer genral. (printf, frpintf, snprintf, scanf)
  3. Lo uso 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 EL FILE DESCRIPTOR DE FILE DESCRIPTOR

  1. Generalmente se usa para IPC.

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


En Unix y los sistemas operativos informáticos relacionados, un descriptor de archivo (FD, con menor frecuencia de fildes) es un indicador abstracto (identificador) utilizado para acceder a un archivo u otro recurso de entrada / salida, como un conducto o un conector de red. Los descriptores de archivos forman parte de la interfaz de programación de aplicaciones POSIX. Un descriptor de archivo es un entero no negativo, aunque normalmente se representa en el lenguaje de programación C como el tipo int, los valores negativos se reservan para indicar "sin valor" o una condición de error.


Las llamadas al sistema utilizan principalmente un descriptor de archivo, por ejemplo, read y write . La función de biblioteca usará los punteros de archivo ( printf , scanf ). Pero las funciones de la biblioteca solo usan llamadas al sistema interno.


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

fopen puede ser inseguro, y probablemente deberías usar fopen_s o open con un conjunto de bits exclusivo. C1X ofrece x modos, por lo que puede fopen modos "rx" , "wx" , etc.

Si usa open , podría considerar open(..., O_EXCL | O_RDONLY,... ) o open(..., O_CREAT | O_EXCL | O_WRONLY,... ) .

Ver, por ejemplo, No hacer suposiciones sobre fopen () y la creación de archivos .


Un descriptor de archivo es solo un entero que se obtiene de la llamada de open() Posix. Utilizando el estándar C fopen() se recupera una estructura FILE . La estructura FILE contiene este descriptor de archivo, entre otras cosas, como fin de archivo e indicador de error, posición de secuencia, etc.

Entonces, usar fopen() le da una cierta cantidad de abstracción en comparación con open() . En general, debería usar fopen() ya que es más portátil y puede usar todas las demás funciones C estándar que usan la estructura FILE , es decir, fprintf() y familia.

No hay problemas de rendimiento con cualquiera o.


Un descriptor de archivo es un "identificador" de enteros de bajo nivel utilizado para identificar un archivo abierto (o un socket, o lo que sea) a nivel de kernel, en Linux y otros sistemas similares a Unix.

Transfiere descripciones de archivos "desnudos" a llamadas de Unix reales, como read() , write() etc.

Un puntero FILE es una construcción de nivel de biblioteca estándar C, que se utiliza para representar un archivo. El FILE envuelve el descriptor de archivo y agrega almacenamiento en búfer y otras características para facilitar las E / S.

fread() punteros de FILE a funciones C estándar como fread() y fwrite() .


Uno está protegido ( FILE * ) y el otro no. En la práctica, desea utilizar FILE * casi siempre cuando está leyendo desde un archivo "real" (es decir, en el disco), a menos que sepa lo que está haciendo o a menos que su archivo sea realmente un zócalo o algo así ...

Puede obtener el descriptor de archivo desde el FILE * usando fileno() y puede abrir un FILE * almacenado desde un descriptor de archivo usando fdopen()


FILE * es más útil cuando trabajas con archivos de texto y entradas / salidas de usuario, porque te permite usar funciones API como sprintf() , sscanf() , fgets() , feof() etc.

La API de descriptor de archivo es de bajo nivel, por lo que permite trabajar con sockets, pipes, archivos mapeados en memoria (y archivos regulares, por supuesto).


Descriptor de archivo vs puntero de archivo

Descriptor de archivo:

File Descriptor es un valor entero devuelto por la llamada al sistema open() .

int fd = open (filePath, mode);

  1. Controlador de nivel Bajo / Kernel.
  2. Passe para leer () y escribir () de las llamadas al sistema UNIX.
  3. No incluye almacenamiento en búfer y tales características.
  4. Menos portátil y carece de eficiencia.

Puntero del archivo:

File Pointer es un puntero a una estructura C devuelto por la función de biblioteca fopen() , que se utiliza para identificar un archivo, ajustar el descriptor de archivo, la 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. Pasó 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.