Domanda

C'è qualche motivo (oltre a quelli sintattici) che vorresti usare

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

O

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

invece di

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

quando si utilizza C in un ambiente Linux?

È stato utile?

Soluzione

In primo luogo, non v'è particolarmente buona ragione per usare fdopen se fopen è un'opzione e open è l'altra scelta possibile. Non si dovrebbe avere open utilizzato per aprire il file in primo luogo se volete un FILE *. Quindi, compreso fdopen in tale elenco non è corretto e confusa perché non è molto come gli altri. Procederò ora di ignorarlo perché la distinzione importante è tra un FILE * C di serie e un descrittore di file specifico per OS.

Ci sono quattro ragioni principali per usare fopen invece di open.

  1. fopen fornisce buffer IO che possono rivelarsi molto più veloce di quello che stai facendo con open.
  2. fopen fa linea che termina traduzione se il file non viene aperto in modalità binaria, che può essere molto utile se il programma è sempre portato ad un ambiente non-Unix.
  3. Un FILE * ti dà la possibilità di utilizzare fscanf e altre funzioni stdio.
  4. Il codice potrebbe un giorno bisogno di essere portato su qualche altra piattaforma che supporta solo ANSI C e non supporta la funzione open.

A mio parere la linea che termina traduzione più spesso viene nel vostro modo di quanto si aiuta, e l'analisi di fscanf è così debole che inevitabilmente finisce per tirare fuori in favore di qualcosa di più utile.

E la maggior parte le piattaforme che supportano C hanno una funzione open.

Che lascia la questione buffering. Nei luoghi in cui si sono principalmente lettura o la scrittura di un file in modo sequenziale, il supporto di buffering è veramente utile e un grande miglioramento della velocità. Ma può portare ad alcuni problemi interessanti in cui i dati non finiscano nel file quando si aspetta che sia lì. Bisogna ricordarsi di fclose o fflush al momento opportuno.

Se stai facendo cerca (aka fsetpos o fseek il secondo dei quali è leggermente più complicato da usare in un modo compatibile con gli standard), l'utilità del buffer scende rapidamente.

Naturalmente, il mio pregiudizio è che io tendo a lavorare con prese un bel po ', e c'è il fatto che si vuole veramente fare non-blocking IO (che FILE * totalmente non riesce a sostenere in alcun modo ragionevole) senza buffer a tutti e spesso hanno i requisiti di analisi complesse davvero colorano le mie percezioni.

Altri suggerimenti

open() è una chiamata di sistema operativo di basso livello. fdopen() converte un file descrittore livello os al livello superiore FILE-astrazione della C linguaggio. fopen() chiama open() in background e ti dà direttamente un file puntatore.

Ci sono molti vantaggi di utilizzare file oggetti descrittori di file piuttosto prime, che comprende una maggiore facilità di utilizzo, ma anche altri vantaggi tecnici come buffer incorporato. Soprattutto il buffer in genere provoca un vantaggio prestazionale notevole.

fopen vs aperto in C

1) fopen è un funzione di libreria Mentre open è un chiamata di sistema.

2) fopen fornisce IO bufferizzato che è più veloce rispetto a open che è non tamponato.

3) fopen È portatile Mentre open non portatile (open è specifico dell'ambiente).

4) fopen restituisce un puntatore ad a Struttura FILE(FILE *); open restituisce un numero intero che identifica il file.

5)A FILE * ti dà la possibilità di utilizzare fscanf e altre funzioni stdio.

Se avete un FILE *, è possibile utilizzare funzioni come fscanf, fprintf e fgets ecc Se si dispone solo il descrittore di file, si hanno limitato (ma probabilmente più veloce) di ingresso e di routine di output read, write etc.

A meno che non sei parte del 0,1% di applicazioni in cui utilizzando open è un beneficio reale delle prestazioni, non c'è davvero nessun buon motivo per non usare fopen. Per quanto riguarda la fdopen è interessato, se non stai giocando con i descrittori di file, non hai bisogno di quella chiamata.

Stick con fopen e la sua famiglia di metodi (fwrite, fread, fprintf, et al) e sarete molto soddisfatti. Altrettanto importante, altri programmatori saranno soddisfatti con il codice.

Utilizzando aprire, leggere, significa scrittura si deve preoccupare di interaptions segnale.

Se la chiamata è stata interrotta da un gestore di segnale delle funzioni torneranno -1 e impostare errno per EINTR.

Quindi il modo corretto di chiudere un file sarebbe

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

open () sarà chiamato al termine di ciascuno dei FOPEN) funzioni della famiglia (. open () è una chiamata di sistema e fopen () sono forniti da librerie come funzioni contenitore per utente facile da usare

open() è una chiamata di sistema e specifico per sistemi basati su Unix e restituisce un descrittore di file. È possibile scrivere su un descrittore di file utilizzando write() che è un'altra chiamata di sistema.
fopen() è una chiamata di funzione ANSI C che restituisce un puntatore a file ed è portabile su altri sistemi operativi. Siamo in grado di scrivere su un puntatore a file utilizzando fprintf.

In Unix:
È possibile ottenere un puntatore a file dal descrittore di file utilizzando:

fP = fdopen(fD, "a");

È possibile ottenere un descrittore di file dal puntatore file usando:

fD = fileno (fP);

Dipende anche da ciò che le bandiere sono tenuti ad aprire. Per quanto riguarda l'utilizzo per la scrittura e la lettura (e la portabilità) f * dovrebbe essere utilizzato, come sostenuto in precedenza.

Ma se in fondo vuole specificare più di bandiere standard (come rw e aggiungere bandiere), si dovrà utilizzare un'API specifica piattaforma (come POSIX aperto) o una libreria che astrae questi dettagli. Il C-standard non ha nessun tali bandiere.

Per esempio si potrebbe desiderare di aprire un file, solo se esce. Se non si specifica il flag creare il file deve esistere. Se si aggiunge esclusiva per creare, sarà solo creare il file se non esiste. Ci sono molti di più.

Ad esempio, su sistemi Linux non v'è un'interfaccia LED esposto attraverso sysfs. Espone la luminosità del LED attraverso un file. Scrittura o lettura di un numero come una stringa che vanno 0-255. Naturalmente non si vuole creare il file e scrivere solo per se esiste. La cosa più cool ora:. Usa fdopen per leggere / scrivere questo file utilizzando le chiamate standard

ho cambiato per aprire () da fopen () per la mia domanda, perché fopen stava causando doppia legge ogni volta che mi sono imbattuto fgetc fopen. Doppia letture erano dirompente di quello che stavo cercando di realizzare. open () sembra solo fare ciò che si chiede di esso.

aprire un file utilizzando fopen
prima di poter leggere (o scrivere) informazioni da (a) un file su un disco dobbiamo aprire il file.per aprire il file abbiamo chiamato la funzione fopen.

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.

questo il modo di comportarsi di fopen funzione
ci sono alcune cause durante il processo di buffering, potrebbe scadere.quindi durante il confronto fopen(I/O di alto livello) a aprire (i/o di basso livello) chiamata di sistema, ed è più veloce e più appropriata di fopen.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top