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?

Était-ce utile?

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);

  1. bas / gestionnaire de niveau du noyau.
  2. passe à lire () et write () du système UNIX appels.
  3. Ne comprend pas mise en mémoire tampon et ces caractéristiques.
  4. 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;
  1. Il est interface de haut niveau.
  2. transmis aux fonctions fread () et fwrite ().
  3. Comprend tampon, indication d'erreur et la détection EOF, etc.
  4. Fournit la portabilité et une plus grande efficacité.

Vous voulez ajouter des points qui pourraient être utiles.

À PROPOS FILE *

  1. ne peut pas être utilisé pour la communication interprocessus (IPC).
  2. l'utiliser quand vous avez besoin genral but d'E / S en mémoire tampon. (Printf, frpintf, snprintf, scanf)
  3. 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

  1. Il est généralement utilisé pour IPC.

  2. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top