Qualcuno può spiegarmi la differenza tra fpurge(FILE *stream)
e fflush(FILE *stream)
in C? Entrambi fflush()
e fpurge()
elimineranno tutti i dati non scritti o non letti nel buffer. Per favore spiegami la differenza esatta tra questi due e anche i loro pro e contro.Differenza tra int fpurge() e int fflush() in C
risposta
Per cominciare, sia le funzioni chiaro il buffer (tipo di buffer operabili sono discussi di seguito), la differenza principale è ciò che accade con i dati presenti nel buffer.
- Per
fflush()
, i dati sono costretti a essere scritti su disco. - Per
fpurge()
, i dati sono scartati.
Detto, fflush()
è una funzione standard C, menzionato nel C11
, capitolo §7.21.5.2.
Considerando che, fpurge()
è una funzione non portatile e non standard. Da man page
Queste funzioni non sono standard e non sono portatili. La funzione
fpurge()
è stata introdotta in 4.4BSD e non è disponibile sotto Linux. La funzione__fpurge()
è stata introdotta in Solaris ed è presente in glibc 2.1.95 e versioni successive.
Ciò detto, la differenza principale utilizzo lato è,
Calling
fflush()
con flusso in ingresso è undefined behavior.Se
stream
indica un flusso di output o un flusso di aggiornamento in cui l'ultima operazione non era ingresso, la funzionefflush
provoca i dati non scritta per talestream
da consegnare all'ambiente host da scrivere il file; in caso contrario, il comportamento è indefinito.Calling
fpurge()
con stream di input è definito.Per ingresso flussi questo scarta alcun input leggere dall'oggetto sottostante, ma non ancora ottenuta tramite
getc(3)
; questo include qualsiasi testo respinto tramiteungetc(3)
.
Eppure, cercare di attenersi a fflush()
.
'fflush' su flussi di input può essere lasciato indefinito da ISO C, ma è specificato da POSIX. L'effetto è simile a quello indicato per 'fpurge', tranne per il fatto che funziona solo su flussi di input * seekable * - ad es.può essere utilizzato per garantire che i dati non aggiornati non siano stati memorizzati nel buffer da un file su disco, ma non per scartare i dati memorizzati da una pipe o da una tty. – hobbs
Rif: http://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html – hobbs
@hobbs Giusto, ma ancora, è stata definita l'implementazione. –
"... sia fflush
e fpurge
scarterà tutti i dati non scritti o letti nel buffer ...": No.
fflush
:La funzione
fflush
forze un scrivere di tutti i dati memorizzati nel buffer per l'output specificato o il flusso di aggiornamento tramite la funzione di scrittura sottostante del flusso. Lo stato di apertura del flusso non è influenzato. Se l'argomento stream èNULL
,fflush
svuota tutti i flussi di output aperti.fpurge
:La funzione
fpurge
cancella qualsiasi ingresso o uscita tamponata stream specificato. Per i flussi di output, questo elimina qualsiasi output non scritto. Per i flussi di input, questo elimina qualsiasi input letto dall'oggetto sottostante ma non ancora ottenuto tramitegetc
. Questo include qualsiasi testo respinto tramiteungetc
. (P.S .: esiste anche__fpurge
, che fa lo stesso, ma senza restituire alcun valore).
A parte l'ovvio effetto sui dati nel buffer, un uso in cui si nota la differenza è con ingresso flussi. Puoi fpurge
uno di questi stream (anche se di solito è un errore, possibilmente concettuale). A seconda dell'ambiente, è possibile che non sia fflush
un flusso di input (il suo comportamento potrebbe essere indefinito, vedere man page). Oltre alle differenze sopra evidenziate: 1) i casi in cui conducono agli errori sono diversi e 2) fflush
può funzionare su tutti i flussi di output con una singola istruzione, come detto (questo potrebbe essere molto utile).
Per quanto riguarda i pro e contro, non vorrei davvero citarli ... semplicemente funzionano in modo diverso (soprattutto), quindi dovresti sapere quando usarli.
Oltre alla funzionale differenza (quello che stavi chiedendo), v'è una differenza portabilità: fflush
è una funzione standard, mentre fpurge
non è (e non è __fpurge
o).
A giudicare dalla pagina di manuale di Linux per ['fpurge()'] (http://linux.die.net/man/3/fpurge), un problema con 'fpurge()' è che non è standard , derivato da BSD 4.4, quindi non è disponibile ovunque. La pagina man di Mac OS X (BSD) descrive 'fpurge()' ma non ne menziona la provenienza - sebbene affermi che 'fseek()', lista sulla stessa pagina, sia conforme allo Standard C così (per deduzione) ' fpurge() 'no. –
Vedere anche [Come posso scaricare dati da una coda di input tty su un sistema Unix?] (Https://stackoverflow.com/questions/10938882/) –