web-dev-qa-db-fra.com

Quelle est la différence entre un descripteur de fichier et un pointeur de fichier?

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?

103
karthi_ms

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().

133
unwind

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

56
Ben

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.

18
Martin Wickman

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

  1. Gestionnaire de niveau bas/noyau.
  2. passe à read () et write () des appels système UNIX.
  3. Ne comprend pas la mise en mémoire tampon et de telles fonctionnalités.
  4. Moins portable et manque d'efficacité.

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;
  1. C'est une interface de haut niveau.
  2. Passé aux fonctions fread () et fwrite ().
  3. Inclut la mise en mémoire tampon, l’indication d’erreur et la détection EOF, etc.
  4. Fournit une portabilité et une efficacité accrues.
13
Yogeesh H T

Voulez-vous ajouter des points qui pourraient être utiles.

À PROPOS FILE *

  1. ne peut pas être utilisé pour la communication interprocessus (IPC).
  2. utilisez-le lorsque vous avez besoin d'E/S avec tampons à usage général (printf, frpintf, snprintf, scanf)
  3. 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

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

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

12
Akshay Patil

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 .

3
jww

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

3
qrdl

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.

1
Pavunkumar