Perché è sempre necessario fseek o fflush tra lettura e scrittura nelle modalità di aggiornamento?

D: Sto cercando di aggiornare un file, usando la modalità fopen "r+" , leggendo una certa stringa e scrivendo una stringa modificata, ma non funziona.

A: Assicurati di chiamare fseek prima di scrivere, sia per cercare all’inizio della stringa che stai cercando di sovrascrivere, sia perché è sempre richiesto un fseek o fflush tra lettura e scrittura nelle modalità “+” di lettura / scrittura .

La mia domanda è perché è sempre necessario fseek o fflush tra lettura e scrittura nelle modalità “+” di lettura / scrittura? La sezione 5.2 di C Traps and Pitfalls di Andrew Koenig (1989) menziona che è a causa di un problema di compatibilità con le versioni precedenti. Qualcuno può spiegare in dettaglio?

La libreria memorizza le operazioni di input e output. Controlla setvbuf () e i parametri _IOFBF, _IOLBF su quel funktion. fseek () o fflush () richiedono che la libreria esegua operazioni bufferizzate. Lo standard specifica un’operazione di seek o flush come obbligatoria per consentire alla libreria alcune scorciatoie; in caso contrario, per ogni operazione di I / O, la lib dovrebbe verificare se l’operazione precedente era anche un op di lettura (o un’opzione di scrittura) e triggersre un flush da solo se la “direzione” dell’I / O cambiava.

Perché mantiene il codice OS / libreria più semplice. Un stream di file potrebbe avere buffer di lettura e scrittura separati e sarebbe necessario uno sforzo supplementare per assicurarsi che siano sempre sincronizzati. Ciò costerebbe le prestazioni nei momentjs in cui non era necessario.

Quindi, il programmatore deve farlo esplicitamente quando è necessario.

Leggete ” La libreria C standard ” di Plauger per alcune informazioni sul perché varie caratteristiche della libreria standard (C89) sono così come sono – e in particolare perché parti della libreria di I / O standard sono come sono. Una ragione è che C funziona su sistemi molto diversi e con diversi media; dispositivi come i nastri potrebbero dover essere maneggiati in qualche modo in modo diverso dall’unità disco a cui sei abituato a pensare. Inoltre, su Unix, considera il tuo dispositivo ‘tty’ – collega una tastiera e un mouse a uno schermo – tre diversi tipi di hardware. Il coordinamento tra questi è abbastanza complicato; le regole nello standard rendono più facile.


Si noti che lo standard lo impone. Questo è dallo standard C11, ISO / IEC 9899: 2011, ma la dicitura era simile nelle precedenti edizioni:

§7.21.5.3 La funzione fopen

¶7 Quando un file viene aperto con la modalità di aggiornamento (‘+’ come secondo o terzo carattere nell’elenco precedente dei valori degli argomenti della modalità), sia l’input che l’output possono essere eseguiti sullo stream associato. Tuttavia, l’uscita non deve essere seguita direttamente da un input senza una chiamata fflush funzione fflush o ad una funzione di posizionamento del file ( fseek , fsetpos o rewind ) e l’input non deve essere seguito direttamente dall’output senza una chiamata fsetpos al posizionamento del file funzione, a meno che l’operazione di input non incontri la fine del file. Aprire (o creare) un file di testo con la modalità di aggiornamento può invece aprire (o creare) un stream binario in alcune implementazioni.