Erstens gibt es keinen besonders guten Grund, fdopen
zu verwenden wenn fopen
ist eine Option und open
ist die andere mögliche Wahl. Sie hätten open
nicht verwenden sollen um die Datei überhaupt zu öffnen, wenn Sie einen FILE *
wollen . Also einschließlich fdopen
in dieser Liste ist falsch und verwirrend, weil es den anderen nicht sehr ähnlich ist. Ich werde es jetzt ignorieren, da die wichtige Unterscheidung hier zwischen einem C-Standard FILE *
besteht und einen betriebssystemspezifischen Dateideskriptor.
Es gibt vier Hauptgründe für die Verwendung von fopen
statt open
.
fopen
bietet Ihnen eine Pufferung von E/A, die sich als viel schneller herausstellen kann als das, was Sie mitopen
tun .fopen
übersetzt das Zeilenende, wenn die Datei nicht im Binärmodus geöffnet ist, was sehr hilfreich sein kann, wenn Ihr Programm jemals in eine Nicht-Unix-Umgebung portiert wird (obwohl die Welt anscheinend nur auf LF konvergiert (außer textbasierte IETF-Netzwerke). Protokolle wie SMTP und HTTP und dergleichen)).- A
FILE *
gibt Ihnen die Möglichkeit,fscanf
zu verwenden und andere stdio-Funktionen. - Ihr Code muss möglicherweise eines Tages auf eine andere Plattform portiert werden, die nur ANSI C und nicht den
open
unterstützt Funktion.
Meiner Meinung nach steht Ihnen die Übersetzung des Zeilenendes eher im Weg, als dass sie Ihnen hilft, 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 einen open
Funktion.
Bleibt die Pufferfrage. An Orten, an denen Sie eine Datei hauptsächlich sequentiell lesen oder schreiben, ist die Pufferunterstützung wirklich hilfreich und eine große Geschwindigkeitsverbesserung. Aber es kann zu einigen interessanten Problemen führen, bei denen Daten nicht in der Datei landen, wenn Sie es erwarten. Sie müssen sich an fclose
erinnern oder fflush
zu den entsprechenden Zeiten.
Wenn Sie suchen (auch bekannt als fsetpos
oder fseek
die zweite davon ist etwas kniffliger in einer standardkonformen Weise zu verwenden), lässt die Nützlichkeit der Pufferung schnell nach.
Natürlich bin ich geneigt, viel mit Sockets zu arbeiten, und da möchte man wirklich nicht-blockierende IO machen (was FILE *
versagt völlig bei der Unterstützung in irgendeiner vernünftigen Weise) ohne jegliche Pufferung und haben oft komplexe Parsing-Anforderungen, die meine Wahrnehmung wirklich färben.
fopen vs. open in C
1) fopen
ist eine Bibliotheksfunktion während open
ist ein Systemaufruf .
2) fopen
bietet gepufferte IO was im Vergleich zu open
schneller ist die nicht gepuffert ist .
3) fopen
ist tragbar während open
nicht tragbar (offen ist umgebungsspezifisch ).
4) fopen
gibt einen Zeiger auf eine FILE-Struktur(FILE *) zurück; open
gibt eine Ganzzahl zurück, die die Datei identifiziert.
5) Ein FILE *
gibt Ihnen die Möglichkeit, fscanf zu verwenden und andere stdio-Funktionen.
open()
ist ein Low-Level-Os-Aufruf. fdopen()
konvertiert einen Dateideskriptor auf Betriebssystemebene in die FILE-Abstraktion auf höherer Ebene der Sprache C. fopen()
ruft open()
auf im Hintergrund und gibt Ihnen direkt einen FILE-Zeiger.
Die Verwendung von FILE-Objekten anstelle von rohen Dateideskriptoren hat mehrere Vorteile, darunter eine einfachere Verwendung, aber auch andere technische Vorteile wie eingebaute Pufferung. Gerade die Pufferung bringt in der Regel einen deutlichen Performance-Vorteil.