2016-05-31 16 views
6

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

+0

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. –

+0

Vedere anche [Come posso scaricare dati da una coda di input tty su un sistema Unix?] (Https://stackoverflow.com/questions/10938882/) –

risposta

2

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 funzione fflush provoca i dati non scritta per tale stream 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 tramite ungetc(3).

Eppure, cercare di attenersi a fflush().

+2

'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

+0

Rif: http://pubs.opengroup.org/onlinepubs/9699919799/functions/fflush.html – hobbs

+0

@hobbs Giusto, ma ancora, è stata definita l'implementazione. –

4

"... sia fflush e fpurge scarterà tutti i dati non scritti o letti nel buffer ...": No.

  • fflush:

    La funzione fflushforze 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 fpurgecancella 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 tramite getc. Questo include qualsiasi testo respinto tramite ungetc. (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).

Qui si trovano le rispettive pagine man (fflush, fpurge).

Problemi correlati