Frage

Ich möchte wissen, den Unterschied zwischen einem Datei-Deskriptor-Datei und pointer.

Auch, in welches Szenario würden Sie verwenden eine statt der anderen?

War es hilfreich?

Lösung

Ein Dateideskriptor ist eine low-level-integer "Griff" dient zur Identifikation einer geöffneten Datei (oder socket oder was auch immer) auf der kernel-Ebene, in Linux und anderen Unix-ähnlichen Systemen.

Sie passieren das "Nackte" Datei-Deskriptoren zu aktuellen Unix-Aufrufe, wie Lesen(), write() und so weiter.

Ein FILE Zeiger ist eine C-standard-library-level-Konstrukt repräsentieren, eine Datei.Die FILE schließt den Dateideskriptor, und fügt die Pufferung und andere Funktionen, um I/O zu erleichtern.

Sie pass FILE Zeiger auf standard-C-Funktionen wie fread() und fwrite().

Andere Tipps

Man ist gepuffert (FILE *) und der andere nicht.In der Praxis, die Sie verwenden möchten FILE * fast immer, wenn Sie Lesen von einer 'echten' file (ie.auf der Festplatte), es sei denn, Sie wissen, was Sie tun, oder wenn Sie Ihre Datei ist eigentlich eine Buchse oder so..

Sie können den Datei-Deskriptor aus der FILE * Verwendung fileno() und können Sie öffnen eine gepufferte FILE * aus einem Datei-Deskriptor-Nutzung fdopen()

Ein Dateideskriptor ist nur eine Ganzzahl, die bekommen Sie von der Posix' open()rufen.Mit der standard-C - fopen() Sie erhalten eine FILE struct zurück.Die FILE struct enthält, die diese Datei-Deskriptor-unter anderem Dinge wie Ende-der-Datei-und-Fehler-Anzeige, die stream-position etc.

So verwenden fopen() bietet Ihnen eine bestimmte Menge der Abstraktion im Vergleich zu open().In der Regel sollten Sie mit fopen() da, die ist mehr tragbare und Sie können alle anderen standard-C-Funktionen verwendet, die die FILE struct, ie fprintf() und Familie.

Es gibt keine performance-Probleme, entweder oder.

Datei-Deskriptor-vs Datei-Zeiger

Datei-Deskriptor:

Dateideskriptor ist ein integer-Wert zurückgegeben open() system call.

int fd = open (filePath, mode);

  1. Low/Kernel-level-handler.
  2. passe auf read() und write() von UNIX System Calls.
  3. Nicht enthalten Pufferung und solche Funktionen.
  4. Weniger tragbar, und es fehlt an Effizienz.

Datei-Zeiger:

Datei-Zeiger ist ein Zeiger auf eine C-Struktur zurückgegeben fopen() library-Funktion, die verwendet wird, um identifiziert eine Datei, die Verpackung der Datei-Deskriptor, Pufferung Funktionalität und alle anderen Funktionen benötigt, für I/O-operation.Der Datei-Zeiger ist vom Typ DATEI, deren definition finden Sie in "/usr/include/stdio.h".Diese definition kann variieren von einem compiler zu einem anderen.

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 ist high-level-Schnittstelle.
  2. Übergeben fread() und fwrite() Funktionen.
  3. Beinhaltet Pufferung,Fehlermelde-und EOF-Erkennung,etc.
  4. Bietet höhere Portabilität und Effizienz.

Wollen, um Punkte hinzuzufügen, die nützlich sein könnten.

ÜBER FILE *

  1. kann nicht verwendet werden für die prozessübergreifende Kommunikation(IPC).
  2. verwenden Sie es, wenn Sie brauchen, Allgemeine Zweck gepuffert I/O.(printf,frpintf,snprintf,scanf)
  3. Ich benutze es oft für debug-Protokolle.Beispiel

                 FILE *fp;
                 fp = fopen("debug.txt","a");
                 fprintf(fp,"I have reached till this point");
                 fclose(fp);
    

ÜBER FILE DESCRIPTOR

  1. Es ist in der Regel verwendet für IPC.

  2. Gibt low-level-Zugriff auf Dateien, die auf *nix-Systemen.(Geräte,Dateien,sockets,etc), also stärker als die FILE *.

FILE * mehr ist nützlich, wenn Sie die Arbeit mit text-Dateien und Benutzer-Eingabe/Ausgabe, weil es Ihnen erlaubt, API-Funktionen verwenden, wie sprintf(), sscanf(), fgets(), feof() etc.

Datei-Deskriptor-API auf niedriger Ebene, so dass es ermöglicht zu arbeiten mit sockets, pipes, memory-mapped-Dateien (und normale Dateien, natürlich).

Nur ein Hinweis: nach Abschluss der Diskussion (wenn Interesse besteht)....

fopen kann unsicher sein, und Sie sollten wahrscheinlich verwenden fopen_s oder open mit exklusiven bits festgelegt.C1X bietet x Modi, so dass Sie können fopen mit Modi "rx", "wx", etc.

Wenn Sie open, sollten Sie ggf. open(..., O_EXCL | O_RDONLY,... ) oder open(..., O_CREAT | O_EXCL | O_WRONLY,... ).

Siehe, zum Beispiel, Machen Sie keine Annahmen über fopen() und die Erstellung der Datei.

System-Anrufe werden meistens mit dem Datei-Deskriptor, beispielsweise read und write.Bibliothek-Funktion die file-Zeiger ( printf , scanf).Aber, Bibliothek Funktionen sind mit intern-system nur Anrufe.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top