Sviluppiamo un algoritmo che calcola il massimo tra numeri letti da un file, usando le funzioni fopen(), fscanf(), fclose() e feof().
Quindi mettiamo in pratica le funzioni che abbiamo studiato nelle precedenti lezioni.
Scrivere quindi un programma in C che apre in lettura un file di testo di nome “numeri.txt” che contiene dei valori numerici. Dopo aver controllato possibili errori di apertura del file, il programma deve calcolare il valore massimo di tutti i numeri presenti nel file.
Innanzitutto apriamo in lettura (r) il file di nome numeri.txt con la funzione fopen. Diamo quindi un messaggio di errore di apertura file se il puntatore restituisce il valore NULL. In questo caso l’errore si può presentare se ad esempio il file che si tenta di aprire non esiste.
Prendiamo il primo elemento del nostro file e lo assegniamo alla variabile max:
if(!feof(fp))
fscanf(fp,”%d\n”, &max);
Ricordiamo che fscanf è la funzione che permette di leggere da un file in modo formattato.
Quindi scorriamo tutto il file andando a leggere il valore numerico. Se il valore che leggiamo è maggiore del nostro valore max allora lo sostituisco.
Infine chiudiamo il file con fclose e visualizziamo in output il numero massimo.
Ecco dunque il listato completo del programma per il calcolo del massimo tra numeri letti da un file:
#include <stdio.h>
#include <stdlib.h>
#define N 5
int main() {
FILE *fp;
int max, voto;
if((fp=fopen("numeri.txt", "rt"))==NULL) {
printf("Errore nell'apertura del file'");
exit(1);
}
//prende il primo elemento e lo inserisce in max
if(!feof(fp))
fscanf(fp,"%d\n", &max);
//scorre gli altri elementi e li confronta con il massimo
while(!feof(fp)){
fscanf(fp,"%d\n", &voto);
if (voto>max)
max=voto;
}
printf("voto: %d\n", max);
fclose(fp);
return 0;
}
Ecco lo stesso esercizio sviluppato utilizzando la funzione max_file:
#include <stdio.h>
#include <stdlib.h>
#define N 5
int max_file(char *nomefile, int *max) {
FILE *fp;
int voto;
if((fp=fopen(nomefile, "r"))==NULL) {
printf("Errore nell'apertura del file'");
exit(1);
}
//prende il primo elemento e lo inserisce in max
if(!feof(fp))
fscanf(fp,"%d\n", max);
while(!feof(fp)){
fscanf(fp,"%d\n", &voto);
if (voto>*max)
*max=voto;
}
fclose(fp);
return 1;
}
void main() {
int massimo;
max_file("numeri.txt", &massimo);
printf("il massimo: %d", massimo);
}
Chiaramente questa è solo una possibile soluzione all’algoritmo per il calcolo del massimo tra numeri letti da un file.
Alcuni link utili
Somma elementi diagonale principale di una matrice
Come sommare gli elementi della cornice esterna
Sommare dei numeri di una matrice
Ricerca elementi in una matrice