Gibt es einen anderen Grund (als syntaktische), den Sie verwenden möchten?
FILE *fdopen(int fd, const char *mode);
oder
FILE *fopen(const char *path, const char *mode);
anstatt
int open(const char *pathname, int flags, mode_t mode);
bei Verwendung von C in einer Linux-Umgebung?
fdopen
undopen
oderfopen
und undopen
?fopen
ist Teil der Standard-C-Bibliothek,open
nicht. Verwenden Sie diese Option,fopen
wenn Sie tragbaren Code schreiben.open
ist allerdings eine POSIX-Funktion.Antworten:
Erstens gibt es keinen besonders guten Grund,
fdopen
wenn diesfopen
eine Option undopen
die andere mögliche Wahl ist. Sie hättenopen
die Datei gar nicht erst öffnen sollen, wenn Sie eine möchtenFILE *
. Die Aufnahmefdopen
in diese Liste ist also falsch und verwirrend, da sie den anderen nicht sehr ähnlich ist. Ich werde es jetzt ignorieren, da hier ein wichtiger Unterschied zwischen einem C-Standard bestehtFILE *
und einem betriebssystemspezifischen Dateideskriptor besteht.Es gibt vier Hauptgründe,
fopen
anstatt zu verwendenopen
.fopen
bietet Ihnen Puffer-E / A, die sich als viel schneller herausstellen können als das, was Sie tunopen
.fopen
führt eine Zeilenendübersetzung durch, wenn die Datei nicht im Binärmodus geöffnet ist. Dies kann sehr hilfreich sein, wenn Ihr Programm jemals in eine Nicht-Unix-Umgebung portiert wurde (obwohl die Welt scheinbar nur auf LF konvergiert (außer auf IETF-Text-basiertem Netzwerk) Protokolle wie SMTP und HTTP und so)).FILE *
gibt Ihnen die Möglichkeit zu verwendenfscanf
und andere Standardfunktionen zu verwenden.open
Funktion nicht unterstützt .Meiner Meinung nach steht Ihnen die Übersetzung am Ende der Zeile häufiger im Weg als hilft Ihnen und das Parsen von
fscanf
ist so schwach, dass Sie es unweigerlich zugunsten von etwas Nützlicherem wegwerfen.Und die meisten Plattformen, die C unterstützen, haben eine
open
Funktion.Damit bleibt die Pufferfrage. An Orten, an denen Sie eine Datei hauptsächlich nacheinander lesen oder schreiben, ist die Pufferunterstützung sehr hilfreich und eine große Geschwindigkeitsverbesserung. Es kann jedoch zu interessanten Problemen kommen, bei denen Daten nicht in der Datei landen, wenn Sie erwarten, dass sie dort vorhanden sind. Sie müssen sich an
fclose
oder erinnernfflush
zu den richtigen Zeiten .Wenn Sie suchen (aka
fsetpos
oderfseek
die zweite ist etwas schwieriger, standardkonform zu verwenden), nimmt der Nutzen der Pufferung schnell ab.Natürlich ist meine Tendenz, dass ich dazu neige, viel mit Sockets zu arbeiten, und da die Tatsache, dass Sie wirklich nicht blockierende E / A-Vorgänge (die
FILE *
in keiner vernünftigen Weise vollständig unterstützt werden) ohne Pufferung und häufig ausführen möchten Komplexe Parsing-Anforderungen haben meine Wahrnehmung wirklich beeinflusst.quelle
fgets
,fgetc
,fscanf
,fread
), liest immer die ganze Größe des Puffers (4K, 8K oder was auch immer Sie setzen). Durch die Verwendung der direkten E / A können Sie dies vermeiden. In diesem Fall ist es sogar noch besser,pread
anstelle eines Such- / Lesepaars (1 Syscall anstelle von 2) zu verwenden.read()
undwrite()
Aufrufen ist ein bequemer fünfter Grund, die libc-Funktionsfamilie zu verwenden.ioctl
auch diefileno
Anruf, derFILE *
eine Nummer annimmt und zurückgibt, die in einemioctl
Anruf verwendet werden kann. Sei aber vorsichtig.FILE *
Verwandte Aufrufe können überraschend mit der Verwendung interagierenioctl
, um etwas am zugrunde liegenden Dateideskriptor zu ändern.open()
ist ein Low-Level-OS-Aufruf.fdopen()
konvertiert einen Dateideskriptor auf Betriebssystemebene in die übergeordnete FILE-Abstraktion der C-Sprache.fopen()
ruftopen()
im Hintergrund auf und gibt Ihnen direkt einen DATEI-Zeiger.Die Verwendung von FILE-Objekten anstelle von Rohdateideskriptoren bietet mehrere Vorteile. Dazu gehören eine einfachere Verwendung, aber auch andere technische Vorteile wie die integrierte Pufferung. Insbesondere die Pufferung führt im Allgemeinen zu einem beträchtlichen Leistungsvorteil.
quelle
fopen()
bietet nicht die gleiche Kontrolle beim Öffnen von Dateien, z. B. Erstellen von Berechtigungen, Freigabemodi und mehr. Typischerweiseopen()
und Varianten bieten viel mehr Kontrolle, nahe an dem, was das Betriebssystem tatsächlich bietetmmap
die Datei ändern und mit normaler E / A Änderungen vornehmen (so unglaublich es auch klingt, dass wir dies in unserem Projekt und aus wirklich guten Gründen tun), die Pufferung würde im Weg stehen.fopen vs open in C.
1)
fopen
ist eine Bibliotheksfunktion, währendopen
es sich um einen Systemaufruf handelt .2)
fopen
liefert gepufferte E / A, die schnelleropen
ist als nicht gepufferte .3)
fopen
ist tragbar , währendopen
nicht tragbar ( offen ist umgebungsspezifische ).4)
fopen
gibt einen Zeiger auf eine FILE-Struktur zurück (FILE *) ;open
Gibt eine Ganzzahl zurück, die die Datei identifiziert.5) A
FILE *
gibt Ihnen die Möglichkeit, fscanf und andere stdio-Funktionen zu verwenden.quelle
open
ist ein POSIX-Standard, also ziemlich portabelWenn Sie nicht zu 0,1% der Anwendungen gehören, bei denen die Verwendung
open
einen tatsächlichen Leistungsvorteil darstellt, gibt es keinen guten Grund, sie nicht zu verwendenfopen
. Soweitfdopen
geht, wenn Sie nicht mit Filedeskriptoren spielen, müssen Sie nicht diesen Anruf.Stick mit
fopen
und seine Familie von Methoden (fwrite
,fread
,fprintf
, et al) , und Sie werden sehr zufrieden sein. Ebenso wichtig ist, dass andere Programmierer mit Ihrem Code zufrieden sind.quelle
Wenn Sie eine haben
FILE *
, können Sie Funktionen wiefscanf
,fprintf
undfgets
etc. Wenn Sie nur den Dateideskriptor haben, haben Sie begrenzt (aber wahrscheinlich schneller) Ein- und Ausgaberoutinenread
,write
usw.quelle
Wenn Sie Öffnen, Lesen und Schreiben verwenden, müssen Sie sich um Signalinteraptionen kümmern.
Wenn der Anruf von einem Signalhandler unterbrochen wurde, geben die Funktionen -1 zurück und setzen errno auf EINTR.
Der richtige Weg, um eine Datei zu schließen, wäre also
quelle
close
hängt dies vom Betriebssystem ab . Es ist falsch, die Schleife unter Linux, AIX und einigen anderen Betriebssystemen durchzuführen.open()
ist ein Systemaufruf und spezifisch für Unix-basierte Systeme und gibt einen Dateideskriptor zurück. Sie können in einen Dateideskriptor schreiben, mitwrite()
dem ein anderer Systemaufruf ausgeführt wird.fopen()
ist ein ANSI C-Funktionsaufruf, der einen Dateizeiger zurückgibt und auf andere Betriebssysteme portierbar ist. Wir können mit in einen Dateizeiger schreibenfprintf
.In Unix:
Sie können einen Dateizeiger aus dem Dateideskriptor abrufen, indem Sie:
Sie können einen Dateideskriptor aus dem Dateizeiger abrufen, indem Sie:
quelle
open () wird am Ende jeder Funktion der fopen () -Familie aufgerufen . open () ist ein Systemaufruf und fopen () werden von Bibliotheken als Wrapper-Funktionen für den Benutzer bereitgestellt
quelle
Ich habe für meine Anwendung von fopen () zu open () gewechselt, da fopen jedes Mal, wenn ich fopen fgetc ausführte, doppelte Lesevorgänge verursachte. Doppelte Lesevorgänge störten das, was ich erreichen wollte. open () scheint nur das zu tun, was Sie von ihm verlangen.
quelle
Hängt auch davon ab, welche Flags zum Öffnen erforderlich sind. In Bezug auf die Verwendung zum Schreiben und Lesen (und die Portabilität) sollte f * verwendet werden, wie oben dargelegt.
Wenn Sie jedoch grundsätzlich mehr als Standardflags (wie rw- und append-Flags) angeben möchten, müssen Sie eine plattformspezifische API (wie POSIX open) oder eine Bibliothek verwenden, die diese Details abstrahiert. Der C-Standard hat keine solchen Flags.
Beispielsweise möchten Sie eine Datei möglicherweise nur öffnen, wenn sie beendet wird. Wenn Sie das Erstellungsflag nicht angeben, muss die Datei vorhanden sein. Wenn Sie exklusiv zum Erstellen hinzufügen, wird die Datei nur erstellt, wenn sie nicht vorhanden ist. Es gibt viele mehr.
Auf Linux-Systemen gibt es beispielsweise eine LED-Schnittstelle, die über sysfs verfügbar gemacht wird. Es zeigt die Helligkeit der LED durch eine Datei. Schreiben oder Lesen einer Zahl als Zeichenfolge zwischen 0 und 255. Natürlich möchten Sie diese Datei nicht erstellen und nur dann in sie schreiben, wenn sie vorhanden ist. Das Coole jetzt: Verwenden Sie fdopen, um diese Datei mit den Standardaufrufen zu lesen / schreiben.
quelle
Öffnen einer Datei mit fopen,
bevor wir Informationen aus einer Datei auf einer Festplatte lesen (oder schreiben) können, müssen wir die Datei öffnen. Um die Datei zu öffnen, haben wir die Funktion fopen aufgerufen.
Dies ist die Art und Weise des Verhaltens der Fopen- Funktion.
Es gibt einige Ursachen für den Pufferungsprozess. Es kann zu einer Zeitüberschreitung kommen. Beim Vergleichen von fopen (High Level I / O) mit offenem (Low Level I / O) Systemaufruf ist dies schneller und geeigneter als fopen .
quelle