Scrivere la media in fondo a un file

Questo esercizio consiste nel leggere di un certo numero di interi da file, calcolare la loro media, e scrivere la media in coda al file.

L'esercizio si risolve facilmente combinando il programma di lettura di un array da file con il programma di scrittura di un intero in coda a un file. Quello che occorre, infatti, è leggere un certo numero di elementi da file (supponiamo che il primo intero rappresenti il numero di interi successivi su file), come nel caso del programma di lettura di un array da file, e poi di scrivere un intero in coda a un file, come nel caso del programma di scrittura in coda a un file.

Il programma che risolve questo problema media.c, legge un vettore da file, e chiude il file. A questo punto il vettore contiene gli elementi del file. Possiamo quindi calcolare la loro media. Per scrivere questo valore in fondo al file, lo apriamo di nuovo in append mode, e scriviamo il valore della media. Dato che il file è stato aperto in append mode, le operazioni di scrittura aggiungono in fondo al file, lasciando inalterato il contenuto precedente.

/*
  Scrive la media degli interi di un file
in fondo al file stesso.
*/

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

int main() {
  int n;
  int vett[100];
  FILE *fd;
  int i;
  int s, m;


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

		/* legge il numero di elementi del vettore */
  fscanf(fd, "%d", &n);

  
		/* legge l'array */
  if(n>=100) 
    printf("Troppi elementi da leggere\n");
  else
    for(i=0; i<=n-1; i++)
      fscanf(fd, "%d", &vett[i]);


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


		/* calcola la media */
  s=0;
  for(i=0; i<=n-1; i++)
    s+=vett[i];
  m=s/n;


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


		/* scrive la media (in fondo al file) */
  fprintf(fd, "%d\n", m);


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

  return 0;
}

In questo programma si vede che è possibile aprire e chiudere lo stesso file più volte all'interno dello stesso programma. Si può anche usare la stessa variabile per memorizzare il descrittore di file. Infatti, se il file viene chiuso, il valore contenuto nella variabile non serve più a niente, dato che il file è stato chiuso.