GNU/Linux >> Linux Esercitazione >  >> Linux

C fopen vs open

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 .

  1. fopen ti fornisce il buffering IO che potrebbe rivelarsi molto più veloce di quello che stai facendo con open .
  2. 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)).
  3. Un FILE * ti dà la possibilità di usare fscanf e altre funzioni stdio.
  4. 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.


Linux
  1. Come creare, estrarre o aprire file RAR in Linux?

  2. Ubuntu:come aprire un file .bak su Linux?

  3. libaio.so.1:impossibile aprire il file oggetto condiviso

  4. Come aprire un nome file tratteggiato usando il terminale?

  5. Come aprire un particolare file da un terminale?

Come aprire file ISO su Ubuntu Linux

Come decomprimere (aprire) il file Gz

Come aprire un file in Linux

Come modificare il limite di file aperti in Linux

Come aprire il file manager di Ubuntu come utente root

Apre un file dato dal risultato di un comando in vim