Qual è la differenza tra un descrittore di file e puntatore al file?
-
19-09-2019 - |
Domanda
Voglio sapere la differenza tra un puntatore descrittore di file e file.
Inoltre, in quale scenario usereste uno invece dell'altro?
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);
- Kernel gestore di Basso / livello.
- passe a read () e write () di chiamate di sistema Unix.
- non include buffering e tali caratteristiche.
- 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;
- Si tratta di un'interfaccia di alto livello.
- Passata ai fread () e fwrite () funzioni.
- Include il buffering, indicazione di errore e la rilevazione EOF, ecc.
- Fornisce maggiore portabilità ed efficienza.
Vuoi aggiungere punti che potrebbero essere utili.
INFO FILE *
- non può essere utilizzato per la comunicazione interprocesso (IPC).
- usarlo quando avete bisogno di Genral scopo buffer di I / O. (Printf, frpintf, snprintf, scanf)
-
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
-
E 'generalmente utilizzato per IPC.
-
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.