Domanda

Voglio sapere la differenza tra un puntatore descrittore di file e file.

Inoltre, in quale scenario usereste uno invece dell'altro?

È stato utile?

Soluzione

Un descrittore di file è un intero di basso livello "manico" usato per identificare un file aperto (o presa, o qualsiasi altra cosa) a livello di kernel, in altri sistemi Unix-like Linux e.

Si passa "nude" descrittori di file per Unix attuale richiede, come read(), write() e così via.

Un puntatore FILE è un livello di libreria standard costrutto C, utilizzato per rappresentare un file. Il FILE avvolge il descrittore di file, e aggiunge buffering e altre caratteristiche per rendere I / O più facile.

Si passa puntatori FILE alle funzioni standard C, come fread() e fwrite().

Altri suggerimenti

Una è tamponato (FILE *) e l'altro non è. In pratica, si desidera utilizzare FILE * quasi sempre quando si sta leggendo da un file di 'reale' (vale a dire. Sull'unità), a meno che non si sa cosa si sta facendo o meno che il file è in realtà una presa di corrente o così ..

È possibile ottenere il descrittore di file dal FILE * utilizzando fileno() e si può aprire un FILE * tamponato da un descrittore di file utilizzando fdopen()

Un descrittore di file è solo un numero intero che si ottiene dal open()call il Posix'. Utilizzando il fopen() di serie C si ottiene un back FILE struct. La struct FILE contiene il descrittore di questo file tra le altre cose, come end-of-file e indicatore di errore, la posizione ecc streaming.

Quindi, utilizzando fopen() ti dà una certa quantità di astrazione rispetto al open(). In generale, si dovrebbe utilizzare fopen() dal momento che è più portabile ed è possibile utilizzare tutte le altre funzioni standard C che utilizza lo struct FILE, cioè fprintf() e la famiglia.

Non ci sono problemi di prestazioni che utilizzano uno o.

del descrittore di file vs puntatore file

del descrittore di file:

descrittore di file è un valore intero restituito da chiamata di sistema open().

int fd = open (filePath, mode);

  1. Kernel gestore di Basso / livello.
  2. passe a read () e write () di chiamate di sistema Unix.
  3. non include buffering e tali caratteristiche.
  4. Meno portatile e manca di efficienza.

puntatore del file:

file puntatore è un puntatore ad una struttura C restituito dalla funzione di libreria fopen(), che viene utilizzato per l'individuazione di un file, avvolgendo il descrittore di file, la funzionalità di buffer e tutte le altre funzionalità necessarie per il funzionamento I / O .La puntatore del file è di tipo File , la cui definizione si possono trovare in "/ usr / include / stdio.h" . Questa definizione può variare da un compilatore all'altro.

FILE *fp = fopen (filePath, mode);

// A FILE Structure returned by fopen 
    typedef struct 
    {
        unsigned char   *_ptr;
        int     _cnt;
        unsigned char   *_base;
        unsigned char   *_bufendp;
        short   _flag;
        short   _file;
        int     __stdioid;
        char    *__newbase;
#ifdef _THREAD_SAFE
        void *_lock;
#else
        long    _unused[1];
#endif
#ifdef __64BIT__
        long    _unused1[4];
#endif /* __64BIT__ */
    } FILE;
  1. Si tratta di un'interfaccia di alto livello.
  2. Passata ai fread () e fwrite () funzioni.
  3. Include il buffering, indicazione di errore e la rilevazione EOF, ecc.
  4. Fornisce maggiore portabilità ed efficienza.

Vuoi aggiungere punti che potrebbero essere utili.

INFO FILE *

  1. non può essere utilizzato per la comunicazione interprocesso (IPC).
  2. usarlo quando avete bisogno di Genral scopo buffer di I / O. (Printf, frpintf, snprintf, scanf)
  3. Io lo uso molte volte per i log di debug. esempio,

                 FILE *fp;
                 fp = fopen("debug.txt","a");
                 fprintf(fp,"I have reached till this point");
                 fclose(fp);
    

INFO FILE DESCRIPTOR

  1. E 'generalmente utilizzato per IPC.

  2. dà il controllo a basso livello di file in sistemi * nix. (Dispositivi, file, socket, ecc), quindi più potente rispetto alla FILE *.

FILE * è più utile quando si lavora con i file di testo e user input / output, perché consente di utilizzare le funzioni API come sprintf(), sscanf(), fgets(), feof() ecc

descrittore File API di basso livello, in modo da permette di lavorare con prese, tubi, file mappati in memoria (e file normali, naturalmente).

Solo una nota per terminare la discussione (se interessati) ....

fopen può essere insicuro, e probabilmente si dovrebbe usare fopen_s o open con le punte esclusive. C1X sta offrendo modalità x, in modo da poter fopen con i modi "rx", "wx", ecc.

Se si utilizza open, si potrebbe considerare open(..., O_EXCL | O_RDONLY,... ) o open(..., O_CREAT | O_EXCL | O_WRONLY,... ).

Si veda, ad esempio, non fare ipotesi circa fopen () e la creazione di file .

Le chiamate di sistema sono per lo più utilizzano descrittore di file, ad esempio read e write. funzione di libreria utilizzerà i puntatori di file (printf, scanf). Ma, funzioni di libreria utilizzano internamente chiamate di sistema solo.

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