Primo, non c'è un motivo particolarmente valido per usare fdopen
se fopen
è un'opzione e open
è l'altra scelta possibile. Non avresti dovuto usare open
per aprire il file in primo luogo se vuoi un FILE *
. Quindi includendo fdopen
in quell'elenco non è corretto e crea confusione perché non è molto simile agli altri. Procederò ora a ignorarlo perché l'importante distinzione qui è tra uno standard C FILE *
e un descrittore di file specifico del sistema operativo.
Ci sono quattro ragioni principali per usare fopen
invece di open
.
fopen
ti fornisce il buffering IO che potrebbe rivelarsi molto più veloce di quello che stai facendo conopen
.fopen
esegue la traduzione di fine riga se il file nonèaperto in modalità binaria, il che può essere molto utile se il tuo programma viene mai portato su un ambiente non Unix (sebbene il mondo sembri convergere solo su LF (eccetto il networking basato su testo IETF protocolli come SMTP e HTTP e simili)).- Un
FILE *
ti dà la possibilità di usarefscanf
e altre funzioni stdio. - Il tuo codice potrebbe un giorno dover essere portato su un'altra piattaforma che supporti solo ANSI C e non supporti
open
funzione.
Secondo me la traduzione di fine riga più spesso ti intralcia piuttosto che aiutarti, e l'analisi di fscanf
è così debole che finisci inevitabilmente per buttarlo via a favore di qualcosa di più utile.
E la maggior parte delle piattaforme che supportano C hanno un open
funzione.
Ciò lascia la domanda sul buffering. Nei luoghi in cui stai principalmente leggendo o scrivendo un file in sequenza, il supporto del buffering è davvero utile e un grande miglioramento della velocità. Ma può portare ad alcuni problemi interessanti in cui i dati non finiscono nel file quando ti aspetti che siano lì. Devi ricordarti di fclose
o fflush
nei momenti opportuni.
Se stai facendo ricerche (ovvero fsetpos
o fseek
il secondo dei quali è leggermente più complicato da usare in modo conforme agli standard), l'utilità del buffering diminuisce rapidamente.
Ovviamente, il mio pregiudizio è che tendo a lavorare molto con i socket, e c'è il fatto che vuoi davvero fare IO non bloccanti (che FILE *
non riesce totalmente a supportare in alcun modo ragionevole) senza alcun buffering e spesso ha requisiti di analisi complessi che colorano davvero le mie percezioni.
fopen vs open in C
1) fopen
è una funzione di libreria mentre open
è una chiamata di sistema .
2) fopen
fornisce IO bufferizzato che è più veloce rispetto a open
che è non bufferizzato .
3) fopen
è portatile mentre open
non portatile (open è specifico per l'ambiente ).
4) fopen
restituisce un puntatore a una struttura FILE(FILE *); open
restituisce un numero intero che identifica il file.
5) Un FILE *
ti dà la possibilità di usare fscanf e altre funzioni stdio.
open()
è una chiamata del sistema operativo di basso livello. fdopen()
converte un descrittore di file a livello di sistema operativo nell'astrazione FILE di livello superiore del linguaggio C. fopen()
chiama open()
in background e ti dà direttamente un puntatore FILE.
Ci sono diversi vantaggi nell'usare oggetti FILE piuttosto che descrittori di file grezzi, che include una maggiore facilità d'uso ma anche altri vantaggi tecnici come il buffering integrato. In particolare, il buffering si traduce generalmente in un considerevole vantaggio in termini di prestazioni.