Was ist der Unterschied zwischen einem Datei-Deskriptor-Datei und pointer?
-
19-09-2019 - |
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?
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);
- Low/Kernel-level-handler.
- passe auf read() und write() von UNIX System Calls.
- Nicht enthalten Pufferung und solche Funktionen.
- 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;
- Es ist high-level-Schnittstelle.
- Übergeben fread() und fwrite() Funktionen.
- Beinhaltet Pufferung,Fehlermelde-und EOF-Erkennung,etc.
- Bietet höhere Portabilität und Effizienz.
Wollen, um Punkte hinzuzufügen, die nützlich sein könnten.
ÜBER FILE *
- kann nicht verwendet werden für die prozessübergreifende Kommunikation(IPC).
- verwenden Sie es, wenn Sie brauchen, Allgemeine Zweck gepuffert I/O.(printf,frpintf,snprintf,scanf)
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
Es ist in der Regel verwendet für IPC.
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.