2010-09-05 8 views
8

Se viene aperto un file utilizzando il seguente comando:L'apertura di un file in modalità 'a +'

FILE *f1=fopen("test.dat","a+"); 

La pagina man recita:

un +

aperto per la lettura e aggiungendo (scrivere alla fine del file). Il file viene creato se non esiste. La posizione iniziale del file per la lettura è all'inizio del file, ma l'output è sempre aggiunto alla fine del file.

Così fa f1 hanno 2 di offset puntatori separati, uno per leggere & un altro per la scrittura?

risposta

18

No.

C'è solo un puntatore che è inizialmente all'inizio del file, ma quando un'operazione di scrittura viene tentata viene spostato alla fine del file. È possibile riposizionarlo utilizzando fseek o rewind in qualsiasi punto del file per la lettura, ma le operazioni di scrittura lo spostano nuovamente alla fine del file.

+0

Può anche essere utile sapere che questo è in genere implementato in termini di 'aperto' con il flag O_APPEND sui sistemi POSIX: http://pubs.opengroup.org/onlinepubs/7908799/xsh/open.html –

+0

In case fseek non viene chiamato prima della lettura, molti spazi sono stampati nel codice seguente. Non mi aspettavo di stampare nulla sullo schermo. Ma c'è un motivo per cui gli spazi vengono stampati? Ciò significa che EOF non viene rilevato correttamente. Se si annulla il commento di seguito, i dati vengono stampati correttamente sullo schermo. 'int main() { FILE * fp1; char ch; fp1 = fopen ("m.txt", "a +"); fput ("dati aggiunti", fp1); // fseek (fp1,0, SEEK_SET); while ((ch = getc (fp1))! = EOF) { putc (ch, stdout); } fclose (fp1); return 0; } ' –

4

No, ha solo un puntatore.

3

Puoi mai lettura mix e operazioni di scrittura su un FILE senza chiamare fseek in mezzo. Può funzionare come desideri su alcune implementazioni, ma un programma che dipende da questo ha un comportamento indefinito. Quindi le domande di avere 2 posizioni non hanno senso.

+0

Vero. Tuttavia, se si vede un'implementazione C di un sistema operativo che supporta le operazioni del file POSIX e dove le operazioni dello stdio FILE sono qualcosa di diverso da un sottile strato di buffering su quelli POSIX (che * do * hanno un comportamento definito in questo caso), * per favore * segnalarlo come un bug contro quel sistema operativo. –

+0

@DairaHopwood: Sono confuso su quello che stai cercando di dire. Il problema di mescolare leggere e scrivere su stdio senza una ricerca intermedia è puramente un problema di buffering. Non ha nulla a che fare con le operazioni sottostanti sui descrittori di file. –

+0

Voglio dire che considero un buggy di implementazione stdio se il suo comportamento indefinito in questo caso si traduce in qualcosa oltre a cambiare dove, se non del tutto, vengono scritti dati bufferizzati. Cioè, la specifica dovrebbe essere che il contenuto del file risultante è definito dall'implementazione, piuttosto che un comportamento veramente indefinito. Altrimenti scoprirai che un sacco di programmi hanno bug di sicurezza sfruttabili. –

Problemi correlati