GNU/Linux >> Znalost Linux >  >> Linux

C fopen vs open

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 .

  1. fopen poskytuje vstup do vyrovnávací paměti, který se může ukázat jako mnohem rychlejší než to, co děláte s open .
  2. 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ě)).
  3. A FILE * vám dává možnost používat fscanf a další stdio funkce.
  4. 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.


Linux
  1. Jak otevřít soubor .8 pomocí aplikace Man?

  2. Otázky k rozhovoru s Linuxem:Otevřít soubory / Otevřít deskriptory souborů

  3. Je fopen() v Linuxu bezpečná funkce vláken?

  1. Jak otevřít - přerušovaný název souboru pomocí terminálu?

  2. Jak otevřít konkrétní soubor z terminálu?

  3. Jak otevřít soubor ve vim pomocí pipe

  1. Jak vytvořit, extrahovat nebo otevřít soubor RAR v Linuxu?

  2. Ubuntu – Jak otevřít soubor .bak na Linuxu?

  3. cp-L vs. cp-H