Erstens gibt es keinen besonders guten Grund, fdopen
wenn dies fopen
eine Option und open
die andere mögliche Wahl ist. Sie hätten open
die Datei gar nicht erst öffnen sollen, wenn Sie eine möchten FILE *
. Die Aufnahme fdopen
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 verwenden open
.
fopen
bietet Ihnen Puffer-E / A, die sich als viel schneller herausstellen können als das, was Sie tun open
.
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)).
- A
FILE *
gibt Ihnen die Möglichkeit zu verwendenfscanf
und andere Standardfunktionen zu verwenden.
- Möglicherweise muss Ihr Code eines Tages auf eine andere Plattform portiert werden, die nur ANSI C unterstützt und die
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.
fdopen
undopen
oderfopen
und undopen
?