Za prvé, neexistuje žádný zvlášť dobrý důvod pro použití fdopen
pokud fopen
je volba a open
je další možná volba. Neměli jste používat open
chcete-li soubor FILE *
, otevřete soubor na prvním místě . Tedy včetně fdopen
v tomto seznamu je nesprávný a matoucí, protože se příliš nepodobá ostatním. Nyní to budu ignorovat, protože důležitý rozdíl je mezi standardem C FILE *
a deskriptor souboru specifický pro OS.
Existují čtyři hlavní důvody, proč používat fopen
místo open
.
fopen
poskytuje vstup do vyrovnávací paměti, který se může ukázat jako mnohem rychlejší než to, co děláte sopen
.fopen
provádí překlad konce řádků, pokud soubor není otevřen v binárním režimu, což může být velmi užitečné, pokud je váš program někdy portován do jiného než unixového prostředí (ačkoli se zdá, že svět konverguje pouze na LF (kromě textových sítí IETF protokoly jako SMTP a HTTP a podobně)).- A
FILE *
vám dává možnost používatfscanf
a další stdio funkce. - Váš kód může být někdy nutné přenést na jinou platformu, která podporuje pouze ANSI C a nepodporuje
open
funkce.
Podle mého názoru vám překlad na konci řádku častěji překáží, než pomáhá, a analýza fscanf
je tak slabý, že ho nevyhnutelně nakonec vyhodíte ve prospěch něčeho užitečnějšího.
A většina platforem, které podporují C, má open
funkce.
Tím zůstává otázka vyrovnávací paměti. V místech, kde hlavně čtete nebo zapisujete soubor sekvenčně, je podpora ukládání do vyrovnávací paměti opravdu užitečná a představuje velké zlepšení rychlosti. Ale může to vést k některým zajímavým problémům, kdy data neskončí v souboru, když očekáváte, že tam budou. Musíte si zapamatovat fclose
nebo fflush
ve vhodnou dobu.
Pokud provádíte hledání (aka fsetpos
nebo fseek
druhý z nich je trochu složitější na použití způsobem vyhovujícím standardům), užitečnost ukládání do vyrovnávací paměti rychle klesá.
Samozřejmě, moje zaujatost je taková, že mám tendenci hodně pracovat se sockety a tam je fakt, že opravdu chcete dělat neblokující IO (což FILE *
naprosto selhává v podpoře žádným rozumným způsobem) bez ukládání do vyrovnávací paměti a často mají složité požadavky na analýzu skutečně zabarvují mé vnímání.
Fopen vs open v C
1) fopen
je funkce knihovny zatímco open
je systémové volání .
2) fopen
poskytuje vstup s vyrovnávací pamětí což je rychlejší v porovnání s open
který není ve vyrovnávací paměti .
3) fopen
je přenosný zatímco open
není přenosný (otevřené je specifické pro prostředí ).
4) fopen
vrátí ukazatel na strukturu FILE(FILE *); open
vrátí celé číslo, které identifikuje soubor.
5) FILE *
vám dává možnost používat fscanf a další stdio funkce.
open()
je nízkoúrovňové volání operačního systému. fdopen()
převede deskriptor souboru na úrovni operačního systému na vyšší úroveň FILE-abstraction jazyka C. fopen()
volání open()
na pozadí a přímo vám poskytne ukazatel FILE.
Existuje několik výhod používání FILE-objects spíše surových deskriptorů souborů, které zahrnují snadnější použití, ale také další technické výhody, jako je vestavěné ukládání do vyrovnávací paměti. Zejména ukládání do vyrovnávací paměti má obecně za následek značnou výkonnostní výhodu.