tutti i problemi posti nella selezione territoriale prevedono l'input dei dati leggendoli da file e l'output dei risultati stampandoli su file. il correttore automatico sottopone il vostro programma ad una serie di test case contenuti in file di testo e verifica l'output prodotto su file di test.
Per gestire un file in linguaggio C è necessario assegnare un’area di memoria con la seguente dichiarazione:
FILE *f;
dove f è il nome assegnato al puntatore a file e indica il nome logico del file, al quale riferirsi nel programma.
APERTURA DEL FILE
In C per aprire un file si usa la funzione fopen (da stdio.h) il cui prototipo è:
FILE* fopen(char* percorso_file, char* modalita_di_apertura);
Come mostrato dal prototipo, la funzione fopen restituisce un puntatore a FILE, che può valere NULL in caso di operazione non riuscita (es. file inesistente); quindi è opportuno controllarlo.
La modalità di apertura su file di testo può essere:
apertura per input (sola lettura): f=fopen("nomeFile.txt","r");
apertura per output (lettura e scrittura): f=fopen("nomeFile.txt","w");
Esempio di apertura di un file (prenotazioni.txt, dalla cartella D:/scuola/Informatica) in C:
// Apro il file prenotazioni.txt in sola letturaFILE* f = fopen("D:/scuola/Informatica/prenotazioni.txt", "r");
if(f==NULL){ printf("Errore durante l'apertura del file \n"); } else{ // Elaborazione e successiva chiusura del file }
fprintf(FILE *f, char *specificatori_di_formato, ...);
Come la printf, con in più il primo parametro che rappresenta il file in cui scrivere. Scrive i dati (specificati a partire dal terzo parametro in poi) in un file di testo. L’uso degli specificatori di formato consente di acquisire correttamente i dati, per rileggerli in modo formattato.
// Apro un file in scrittura (dovrei controllare eventuali errori)FILE* f=fopen("doppio.txt","w"); int a=10, b; b=a*2; fprintf(f, "Il doppio di %d e' %d \n", a, b);
fscanf(FILE *f, char *specificatori_di_formato, ...);
Come la scanf, con in più il primo parametro che rappresenta il file da cui leggere. Legge dati da un file di testo, in modo formattato in base agli specificatori di formato. Gli indirizzi delle variabili in cui memorizzare i dati letti vengono specificati a partire dal terzo parametro in poi.
Supponiamo di avere un file di testo di nome esempio.txt il cui contenuto è il seguente:
12 3 21 Mario
Il seguente frammento di codice legge i 3 numeri e la stringa presenti nel file, memorizzandoli in altrettante variabili:
// Apro il file in sola lettura (dovrei controllare eventuali errori)FILE* f=fopen("esempio.txt","r"); int a, b, c; char str[128]; fscanf(f, "%d %d %d %s", &a, &b, &c, str);
Per memorizzare in una stringa un'intera riga di un file di testo si può utilizzare la seguente funzione:
char* fgets(char* str, int nCaratteri, FILE* f);
str è la stringa in cui memorizzare i caratteri letti dal file;
nCaratteri indica il numero massimo di caratteri da leggere (corrispondente alla dimensione della stringa str), compreso il terminatore di stringa (automaticamente aggiunto a str dalla funzione);
f è il puntatore al file da cui leggere i caratteri.
fgets legge da un file di testo un'intera riga e la carica nella stringa str, restituendo un puntatore a str o NULL (puntatore nullo) se viene incontrata la fine del file senza che sia stato letto nemmeno un carattere.
// Apro il file in sola lettura (dovrei controllare eventuali errori)FILE* f=fopen("esempio.txt","r"); char str[128]; fgets(str,128,f);
E' possibile creare un file di testo con un qualsiasi Editor di testo non formattato (come il “Blocco Note” di Windows) separando opportunamente i valori da leggere (usando lo spazio o la tabulazione o il new line per un nuovo dato); in fase di lettura ne dovremo tenere conto.
Durante la fase di lettura posso controllare il raggiungimento della fine del file attraverso la funzione feof (definita anch'essa nell’header stdio.h):
int feof(FILE f*);
Restituisce 0 (falso) se non si è raggiunta la fine del file, un valore diverso da 0 (vero) se si è a fine file (o se il file è vuoto).
FILE* f=fopen("esempio.txt","r"); char str[128]; int i;
// !feof(f) equivale a feof(f)==0
while(!feof(f)) {fscanf(f,"%c",&str[i]); i++;} str[i]='\0'; printf("%s\n", str);
Al termine delle operazione è necessario chiudere il collegamento tra Memoria Centrale e Memoria di Massa, per evitare di tentare di aprire un file già aperto o per riaprirlo in un’altra modalità:
int fclose(FILE *f);
Chiude il file, restituendo 0 in caso di successo, EOF in caso di fallimento.
int controllo; // Apro il file in sola lettura (dovrei controllare eventuali errori)FILE* f=fopen("esempio.txt","r"); // Elaboro in qualche modo il file ... // Chiudo il file controllo=fclose(f); if(controllo==0) printf("File chiuso correttamente\n"); else printf("Errore nella chiusura del file\n");