Je veux connaître la différence entre un descripteur de fichier et un pointeur de fichier.
De plus, dans quel scénario utiliseriez-vous l'un au lieu de l'autre?
Un descripteur de fichier est un "handle" entier de bas niveau utilisé pour identifier un fichier ouvert (ou un socket, ou autre) au niveau du noyau, sous Linux et d'autres systèmes de type Unix.
Vous transmettez des descripteurs de fichier "nus" aux appels Unix, tels que read()
, write()
, etc.
Un pointeur FILE
est une construction C standard au niveau de la bibliothèque, utilisée pour représenter un fichier. La FILE
enveloppe le descripteur de fichier et ajoute la mise en mémoire tampon ainsi que d'autres fonctionnalités pour faciliter les E/S.
Vous transmettez des pointeurs FILE
à des fonctions C standard telles que fread()
et fwrite()
.
L'un est mis en mémoire tampon (FILE *
) Et l'autre ne l'est pas. En pratique, vous voulez utiliser FILE *
Presque toujours lorsque vous lisez un fichier "réel" (c'est-à-dire sur le lecteur), sauf si vous savez ce que vous faites ou si votre fichier est en fait un socket ou autre. ..
Vous pouvez obtenir le descripteur de fichier à partir de 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 entier que vous obtenez à partir de l'appel open()
de Posix. En utilisant le standard C fopen()
, vous obtenez une structure FILE
. La structure FILE
contient notamment le descripteur de fichier this, tel que l'indicateur de fin de fichier et d'erreur, la position du flux, etc.
Donc, en utilisant fopen()
vous donne une certaine quantité d'abstraction par rapport à open()
. En général, vous devriez utiliser fopen()
, car il est plus portable et vous pouvez utiliser toutes les autres fonctions C standard utilisant la structure FILE
, c'est-à-dire fprintf()
et la famille.
Il n'y a pas de problèmes de performances avec ou.
descripteur de fichier vs pointeur de fichier
Descripteur de fichier:
Le descripteur de fichier est une valeur entière renvoyée par open()
appel système.
int fd = open (filePath, mode);
Pointeur de fichier:
File Pointer est un pointeur sur une structure C retournée par la fonction de bibliothèque fopen()
, utilisée pour identifier un fichier, encapsuler le descripteur de fichier, la fonctionnalité de mise en mémoire tampon et toute autre fonctionnalité nécessaire au fonctionnement des E/S. Le pointeur de fichier est de type FICHIER , dont la définition peut être trouvée 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;
Voulez-vous ajouter des points qui pourraient être utiles.
À PROPOS FILE *
Je l'utilise plusieurs fois pour les journaux de débogage. 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 un contrôle de bas niveau sur les fichiers sur les systèmes * nix (périphériques, fichiers, sockets, etc.), donc plus puissants que le FILE *
.
Juste une note pour terminer la discussion (si vous êtes intéressé) ....
fopen
peut ne pas être sûr, et vous devriez probablement utiliser fopen_s
ou open
avec des bits exclusifs. C1X offre les modes x
afin que vous puissiez fopen
avec les modes "rx"
, "wx"
, Etc.
Si vous utilisez open
, vous pouvez envisager open(..., O_EXCL | O_RDONLY,... )
ou open(..., O_CREAT | O_EXCL | O_WRONLY,... )
.
Voir, par exemple, Ne faites pas d'hypothèses sur fopen () et la création de fichiers .
FILE *
Est plus utile lorsque vous travaillez avec des fichiers texte et des entrées/sorties utilisateur, car il vous permet d’utiliser des fonctions API telles que sprintf()
, sscanf()
, fgets()
, feof()
etc.
L'API de descripteur de fichier est de bas niveau, elle permet donc de travailler avec des sockets, des pipes, des fichiers mappés en mémoire (et des fichiers normaux, bien sûr).
Les appels système utilisent principalement un descripteur de fichier, par exemple read
et write
. La fonction de bibliothèque utilisera les pointeurs de fichiers (printf
, scanf
). Cependant, les fonctions de la bibliothèque utilisent uniquement des appels système internes.