Scrittura in coda a un file

Fino ad ora, si sono visti solo due modi di accedere a un file: in lettura e in scrittura. Esiste un terzo modo, che in effetti è un secondo metodo di apertura in scrittura.

Come si è visto, facendo fopen(..., "w"), se il file esiste il suo contenuto viene azzerato, e si comincia a scrivere dall'inizio. È possibile fare in modo che la scrittura avvenga di seguito al file, piuttosto che all'inizio. La modalità append permette appunto di aprire un file in maniera che sia possibile scrivere in coda al contentuto attuale del file:

  fd = fopen("....", "a");

Si tratta quindi semplicemente di passare la stringa "a" come secondo argomento alla funzione fopen. L'effetto di questa istruzione è che risulta ora possibile scrivere sul file usando la funzione fprintf.

Per chiarire meglio la differenza fra la modalitè w e la modalità a, vediamo cosa succede se un file, che già esiste, viene aperto in scrittura nei due casi, e poi subito dopo chiuso.

w
il file viene azzerato, ossia il suo contenuto viene cancellato; alla fine della chiamata alla funzione fopen, la sua dimensione è 0;
a
il file viene aperto in scrittura in fondo, ossia tutte le cose che verranno scritte andranno ad aggiungersi a quelle che già stanno sul file; quindi, la operazione di apertura non modifica il contenuto del file; se il file viene chiuso subito dopo, non subisce modifiche.

La differenza fra le due modalità di apertura è quindi che, nel primo caso, l'intero contenuto del file viene cancellato, e le operazioni di scrittura vanno a scrivere sul file dall'inizio; al contrario, il secondo modo (append) lascia inalterato il contenuto del file, e le operazioni di scrittura aggiungono dati in fondo al file.

Il programma append.c apre un file in append, e scrive un numero in coda al file. L'effetto è quello di aggiungere il numero in fondo al file. Si noti che la istruzione che si usa per scrivere sul file è sempre la istruzione fprintf. La differenza fra questo programma e quello che scrive su file cancellando il contenuto precedente scrivi.c non è nella istruzione di scrittura, ma solo nel modo in cui il file viene aperto. In altre parole, per scrivere si usa comunque l'istruzione fprintf, esattamente nello stessp modo; la differenza fra scrittura dall'inizio del file e scrittura in coda sta solo nel modo in cui il file viene aperto.

/*
  Scrive un intero in coda a un file
*/

#include<stdlib.h>
#include<stdio.h>

int main() {
  FILE *fd;
  int x=-32;

		/* apre il file in scrittura */
  fd=fopen("scrivi.txt", "a");
  if( fd==NULL ) {
    perror("Errore in apertura del file");
    exit(1);
  }


		/* scrive il numero */
  fprintf(fd, "%d\n", x);


		/* chiude il file */
  fclose(fd);

  return 0;
}

Anche nel caso in cui il file viene aperto in append mode, la istruzione fopen può ritornare un errore. Per rilevare possibili errori, va messa una istruzione condizionale per controllare se l'operazione di apertura ha avuto successo.

Come nel caso della apertura in scrittura, il file viene creato (vuoto) se non esiste. Quindi, se non esiste un file il cui nome è quello passato come primo argomento alla funzione fopen, allora non c'è nessuna differenza fra l'apertura in scrittura e l'apertura con scrittura in coda.