2013-04-23 18 views
9

Ho un buon vecchio descrittore di file C FILE in Windows che viene utilizzato da un flusso di output per scrivere dati su. La mia domanda è semplice e tuttavia non sono riuscito a trovare la risposta:Quando è stato scaricato FILE?

Quando il contenuto viene scaricato sul disco presumendo che non chiami fflush?

Il flusso riceve costantemente dati e sembra che il contenuto venga scaricato abbastanza spesso, ma qual è la regola per lo scarico?

+3

Abbastanza sicuro che dipende dal sistema operativo. – Phonon

+0

BTW in realtà il codice utilizza un wxTextOutputStream che utilizza un wxFFileOutoutStream che utilizza un wxFFile. Ma questo incapsula solo una struttura FILE quindi immagino che il meccanismo di fflush sia la cosa interessante qui ... – anhoppe

+1

Se è bufferizzato, viene svuotato una volta che il buffer è pieno. E non capisco cosa intendi per struttura FILE (fopen , fwrite, ....) –

risposta

13

Se la realizzazione libreria può determinare il flusso di uscita non si riferiscono ad un dispositivo interattivo (e solo poi), il flusso sarà completamente tamponato, cioè saranno svuotate quando il buffer (default di BUFSIZ dimensioni) è pieno.

Se non fully-buffered, un flusso può essere tamponata linea, vale a dire che verrà lavato quando un '\n' è scritto (o il buffer è pieno, se la vostra linea è davvero lunga), o senza buffer.

(ISO/IEC 9899: 1999, capitolo 7.19.5.3 "La funzione fopen()", comma 7. Non hanno una versione più recente dello standard a portata di mano, ma per quanto ne so questo non è cambiato.)

Ciò che costituisce un "dispositivo interattivo" è definito dall'implementazione. (Capitolo 5.1.2.3 "Esecuzione del programma", paragrafo 6.)

L'idea generale è che l'output del file debba essere completamente bufferizzato mentre l'uscita del terminale deve essere bufferizzata in linea (o unbuffered, come correttamente sottolineato da Jesse Good).

Sia il criterio di buffering che la dimensione del buffer possono essere modificati tramite setvbuf(). Si noti che qualsiasi modifica di questo tipo deve avvenire prima dello si inizia ad accedere allo stream, il che è piuttosto ovvio una volta che ci si pensa.

+0

Man, questa è una buona risposta, grazie – anhoppe

+1

@anhoppe: In realtà ho * implementato * '', e * ragazzo * è meglio imparare a leggere la stampa fine quando lo fai ... MrGreen – DevSolar

+0

+1 Inoltre, lo [standard C11] (http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf) specifica che 'BUFSIZ' dovrebbe essere _almeno_ 256. –

Problemi correlati