GNU/Linux >> LINUX-Kenntnisse >  >> Linux

C fopen gegen offen

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 .

  1. fopen bietet Ihnen eine Pufferung von E/A, die sich als viel schneller herausstellen kann als das, was Sie mit open tun .
  2. 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)).
  3. A FILE * gibt Ihnen die Möglichkeit, fscanf zu verwenden und andere stdio-Funktionen.
  4. 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.


Linux
  1. Ubuntu – Wie öffnet man eine .bak-Datei unter Linux?

  2. Wie öffne ich eine .8-Datei mit Man?

  3. open() in Python erstellt keine Datei, wenn sie nicht existiert

  4. Öffnen Sie eine Datei mit dem Standardprogramm im Knoten-Webkit

  5. So öffnen Sie eine Datei in vim mit Pipe

So öffnen Sie ISO-Dateien unter Ubuntu Linux

So entpacken (öffnen) Sie die Gz-Datei

So öffnen Sie eine Datei unter Linux

So ändern Sie das Limit für offene Dateien in Linux

So öffnen Sie den Ubuntu-Dateimanager als Root-Benutzer

cp-L vs. cp-H