Erstens gibt es keinen besonders guten Grund, fdopenwenn dies fopeneine Option und opendie andere mögliche Wahl ist. Sie hätten opendie Datei gar nicht erst öffnen sollen, wenn Sie eine möchten FILE *. Die Aufnahme fdopenin 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, fopenanstatt 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
openFunktion 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 fcloseoder erinnernfflush zu den richtigen Zeiten .
Wenn Sie suchen (aka fsetposoderfseek 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.
fdopenundopenoderfopenund undopen?