Quelle est la différence entre un descripteur de fichier et le pointeur de fichier?
-
19-09-2019 - |
Question
Je veux savoir la différence entre un descripteur de fichier et pointeur fichier.
En outre, dans quel scénario voulez-vous utiliser une place de l'autre?
La solution
Un descripteur de fichier est un nombre entier de bas niveau « poignée » utilisée pour identifier un fichier ouvert (ou de la douille, ou autre) au niveau du noyau, sous Linux et d'autres systèmes Unix.
Vous passez des descripteurs de fichiers « nus » aux appels Unix réelle, comme read()
, write()
et ainsi de suite.
Un pointeur FILE
est une norme C assemblage bibliothèque de niveau, utilisée pour représenter un fichier. Le FILE
enveloppe le descripteur de fichier, et ajoute en mémoire tampon et d'autres fonctionnalités pour rendre E / S plus facile.
Vous passez des pointeurs de FILE
aux fonctions standard telles que C fread()
et fwrite()
.
Autres conseils
One est tamponnées (FILE *
) et l'autre n'est pas. Dans la pratique, vous voulez utiliser FILE *
presque toujours lorsque vous lisez à partir d'un fichier « réel » (ie. Sur le lecteur), sauf si vous savez ce que vous faites ou si votre fichier est en fait une prise ou si ..
Vous pouvez obtenir le descripteur de fichier à partir du FILE *
en utilisant fileno()
et vous pouvez ouvrir un tampon FILE *
à partir d'un descripteur de fichier en utilisant fdopen()
Un descripteur de fichier est juste un nombre entier que vous obtenez de open()
call la Posix. Utilisation de la fopen()
standard C vous obtenez un retour struct FILE
. La struct FILE
contient le présent descripteur de fichier entre autres choses telles que la fin de fichier et l'indicateur d'erreur, la position flux etc.
Donc, en utilisant fopen()
vous donne une certaine quantité d'abstraction par rapport à open()
. En général, vous devriez utiliser fopen()
puisque c'est plus facile à transporter et vous pouvez utiliser toutes les autres fonctions standard C qui utilise le struct FILE
, c.-à-fprintf()
et de la famille.
Il n'y a pas de problèmes de performance en utilisant ou.
descripteur de fichier vs pointeur de fichier
Le descripteur de fichier:
descripteur de fichier est une valeur entière retournée par appel système open()
.
int fd = open (filePath, mode);
- bas / gestionnaire de niveau du noyau.
- passe à lire () et write () du système UNIX appels.
- Ne comprend pas mise en mémoire tampon et ces caractéristiques.
- Moins d'efficacité portable et ne dispose pas.
pointeur de fichier:
Fichier pointeur est un pointeur vers une structure C retournée par la fonction de bibliothèque de fopen()
, qui est utilisé pour identification d'un fichier, enveloppant le descripteur de fichier, la fonctionnalité de mise en mémoire tampon et toutes les autres fonctions nécessaires pour un fonctionnement I / O .Le pointeur de fichier est de type dOSSIER , dont la définition se trouve dans "/ usr / include / stdio.h" . Cette définition peut varier d'un compilateur à l'autre.
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;
- Il est interface de haut niveau.
- transmis aux fonctions fread () et fwrite ().
- Comprend tampon, indication d'erreur et la détection EOF, etc.
- Fournit la portabilité et une plus grande efficacité.
Vous voulez ajouter des points qui pourraient être utiles.
À PROPOS FILE *
- ne peut pas être utilisé pour la communication interprocessus (IPC).
- l'utiliser quand vous avez besoin genral but d'E / S en mémoire tampon. (Printf, frpintf, snprintf, scanf)
-
Je l'utilise plusieurs fois pour les journaux de débogage. par exemple,
FILE *fp; fp = fopen("debug.txt","a"); fprintf(fp,"I have reached till this point"); fclose(fp);
À PROPOS FILE DESCRIPTOR
-
Il est généralement utilisé pour IPC.
-
donne le contrôle de bas niveau aux fichiers sur les systèmes * nix. (Appareils, fichiers, sockets, etc), donc plus puissant que le
FILE *
.
FILE *
est plus utile lorsque vous travaillez avec des fichiers texte et entrée / sortie utilisateur, car il vous permet d'utiliser les fonctions de l'API comme sprintf()
, sscanf()
, fgets()
, feof()
etc.
API de descripteur de fichier est de bas niveau, il permet de travailler avec des sockets, des pipes, des fichiers mappés en mémoire (et les fichiers réguliers, bien sûr).
Juste un mot pour terminer la discussion (si vous êtes intéressé) ....
fopen
peut être peu sûr, et vous devriez probablement utiliser fopen_s
ou open
avec des morceaux exclusifs définis. C1X offre des modes de x
, afin que vous puissiez fopen
avec les modes "rx"
, "wx"
, etc.
Si vous utilisez open
, vous pourriez envisager open(..., O_EXCL | O_RDONLY,... )
ou open(..., O_CREAT | O_EXCL | O_WRONLY,... )
.
Voir, par exemple, ne pas faire des hypothèses sur fopen () et la création de fichiers .
Les appels système sont la plupart du temps en utilisant le descripteur de fichier, par exemple read
et write
. fonction de bibliothèque utilisera les pointeurs de fichiers (printf
, scanf
). Mais, les fonctions de bibliothèque utilisent en interne les appels système uniquement.