Frage

Gibt es einen Grund (außer syntaktisch), die Sie verwenden möchten

FILE *fdopen(int fd, const char *mode);

oder

FILE *fopen(const char *path, const char *mode);

Anstatt von

int open(const char *pathname, int flags, mode_t mode);

Wenn Sie C in einer Linux -Umgebung verwenden?

War es hilfreich?

Lösung

Erstens gibt es keinen besonders guten Grund zu verwenden fdopen wenn fopen ist eine Option und open ist die andere mögliche Wahl. Sie hätten nicht benutzen sollen open Um die Datei überhaupt zu öffnen, wenn Sie a wollen FILE *. Also einschließlich fdopen In dieser Liste ist falsch und verwirrend, weil es den anderen nicht sehr ähnlich ist. Ich werde jetzt fortfahren, es zu ignorieren, weil die wichtige Unterscheidung hier zwischen einem C -Standard liegt FILE * und ein osspezifischer Dateideskriptor.

Es gibt vier Hauptgründe zu verwenden fopen Anstatt von open.

  1. fopen bietet Ihnen ein Puffer -IO, das sich möglicherweise als viel schneller herausstellen als das, was Sie tun open.
  2. fopen Ist eine Übersetzung von Zeilenende, wenn die Datei nicht im Binärmodus geöffnet wird, was sehr hilfreich sein kann, wenn Ihr Programm jemals auf eine Nicht-Unix-Umgebung portiert wird.
  3. EIN FILE * gibt Ihnen die Möglichkeit zu verwenden fscanf und andere Stdio -Funktionen.
  4. Ihr Code kann eines Tages auf eine andere Plattform portiert werden, die nur ANSI C unterstützt und die nicht unterstützt open Funktion.

Meiner Meinung nach steht die Übersetzung von Linien öfter in die Richtung, als Ihnen hilft, und das Parsen von fscanf ist so schwach, dass Sie es unweigerlich zugunsten von etwas Nützlicherem werfen.

Und die meisten Plattformen, die C unterstützen, haben eine open Funktion.

Das lässt die Pufferfrage. An Orten, an denen Sie hauptsächlich eine Datei nacheinander lesen oder schreiben, ist die Pufferunterstützung sehr hilfreich und eine große Geschwindigkeitsverbesserung. Dies kann jedoch zu einigen interessanten Problemen führen, bei denen Daten nicht in der Datei landen, wenn Sie erwarten, dass sie dort sind. Sie müssen sich daran erinnern fclose oder fflush zu den richtigen Zeiten.

Wenn Sie suchen (auch bekannt als fsetpos oder fseek Die zweite davon ist etwas schwieriger, in Standards konform zu verwenden), der Nutzen der Pufferung geht schnell aus.

Natürlich ist meine Vorurteile, dass ich dazu neige, viel mit Sockets zu arbeiten, und dort die Tatsache, dass Sie wirklich nicht blockierende IO machen möchten (was FILE * unterstützt es in keiner Weise nicht angemessen) ohne Pufferung und haben oft komplexe Anforderungen an die Parsen, färben meine Wahrnehmungen wirklich.

Andere Tipps

open() ist ein Betriebssystem auf niedriger Ebene. fdopen() Konvertiert einen Dateideskriptor auf OS-Ebene in die höhere Dateiabteilung der C-Sprache. fopen() Anrufe open() Im Hintergrund und gibt Ihnen direkt einen Dateizeiger.

Die Verwendung von Datei-Objekten, die eher rohe Dateideskriptoren verwenden, haben mehrere Vorteile, einschließlich einer besseren Nutzung, aber auch anderen technischen Vorteilen wie integrierten Pufferung. Insbesondere die Pufferung führt im Allgemeinen zu einem beträchtlichen Leistungsvorteil.

fopen gegen offen in c

1) fopen ist ein Bibliotheksfunktion während open ist ein Systemanruf.

2) fopen bietet gepufferter IO das ist schneller im Vergleich zu open welches ist nicht gepuffert.

3) fopen ist tragbar während open nicht tragbar (Offen ist umweltspezifisch).

4) fopen Gibt einen Zeiger auf a zurück Dateistruktur (Datei *); open Gibt eine Ganzzahl zurück, die die Datei identifiziert.

5) a FILE * gibt Ihnen die Möglichkeit zu verwenden fscanf und andere Stdio -Funktionen.

Wenn Sie eine haben FILE *, Sie können Funktionen wie verwenden fscanf, fprintf und fgets usw. Wenn Sie nur den Dateideskriptor haben, haben Sie nur begrenzte (aber wahrscheinlich schnellere) Eingangs- und Ausgaberoutinen read, write usw.

Es sei denn, Sie sind Teil der 0,1% der Anwendungen, bei denen open ist ein tatsächlicher Leistungsvorteil, es gibt wirklich keinen guten Grund, nicht zu verwenden fopen. So weit wie fdopen Besorgt ist es, wenn Sie nicht mit Dateideskriptoren spielen, benötigen Sie diesen Anruf nicht.

Bleiben bei fopen und seine Methodenfamilie (fwrite, fread, fprintf, et al) und Sie werden sehr zufrieden sein. Ebenso wichtig ist, dass andere Programmierer mit Ihrem Code zufrieden sein werden.

Mit offenem, Lesen, Schreiben müssen Sie sich Sorgen um Signalinterapaten machen.

Wenn der Anruf von einem Signalhandler unterbrochen wurde, gibt die Funktionen -1 zurück und setzt Errno auf Eintr.

Der richtige Weg, um eine Datei zu schließen, wäre also

while (retval = close(fd), retval == -1 && ernno == EINTR) ;

offen() wird am Ende jedes der jeweils angerufen werden fopen () Familienfunktionen. offen() ist ein Systemanruf und fopen () werden von Bibliotheken als Wrapper -Funktion für Benutzer einfach zur Verfügung gestellt

open() ist ein Systemaufruf und spezifisch für UNIX-basierte Systeme und gibt einen Dateideskriptor zurück. Sie können an einen Dateideskriptor schreiben write() Das ist ein weiterer Systemanruf.
fopen() ist ein ANSI C -Funktionsaufruf, der einen Dateizeiger zurückgibt und für andere OSS tragbar ist. Wir können an einen Dateizeiger schreiben fprintf.

In Unix:
Sie können einen Dateizeiger aus dem Dateideskriptor verwenden:

fP = fdopen(fD, "a");

Sie können einen Dateideskriptor aus dem Dateizeiger verwenden:

fD = fileno (fP);

Hängt auch davon ab, welche Flaggen geöffnet werden müssen. In Bezug auf die Verwendung für das Schreiben und Lesen (und die Portabilität) f* sollte, wie oben argumentiert, verwendet werden.

Wenn Sie jedoch im Grunde mehr als Standard -Flags (wie RW- und Anhang -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 Flaggen.

Zum Beispiel möchten Sie möglicherweise nur eine Datei öffnen, wenn sie ausgeht. Wenn Sie das Flag erstellen nicht angeben, muss die Datei vorhanden sein. Wenn Sie exklusiv zum Erstellen hinzufügen, wird die Datei nur dann erstellt, wenn sie nicht vorhanden ist. Es gibt viele mehr.

Zum Beispiel auf Linux -Systemen gibt es eine LED -Schnittstelle über SYSFs. Es enthüllt die Helligkeit der LED durch eine Datei. Schreiben oder Lesen einer Nummer als Zeichenfolge zwischen 0-255. Natürlich möchten Sie diese Datei nicht erstellen und nur darauf schreiben, wenn sie existiert. Das Coole jetzt: Verwenden Sie FDOPEN, um diese Datei mit den Standardaufrufen zu lesen/zu schreiben.

Ich habe mich für meine Anwendung zu öffnen () von fopen () geändert, da Fopen jedes Mal, wenn ich fopen fGetc leitete, Doppellesungen verursachte. Doppelte Reads störten das, was ich zu erreichen versuchte. Open () scheint einfach das zu tun, was Sie danach verlangen.

Öffnen einer Datei mithilfe fopen
Bevor wir Informationen von einer Datei auf einer Festplatte lesen (oder schreiben), müssen wir die Datei öffnen. Um die Datei zu öffnen, haben wir die Funktion fopen genannt.

1.firstly it searches on the disk the file to be opened.
2.then it loads the file from the disk into a place in memory called buffer.
3.it sets up a character pointer that points to the first character of the buffer.

Dies ist die Art des Verhaltens von fopen Funktion
Es gibt einige Ursachen während des Pufferprozesses, es kann zeitlich eingestellt werden. Also beim Vergleich fopen(hoher E/O) zu offen (Low Level E/O) -Systemanruf, und er ist schneller angemessener als fopen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top