19: Introduzione ai File

Bentornati cari lettori, siamo quasi giunti agli atti finali del nostro corso per programmare in C . Oggi vi presenteremo il penultimo argomento che tratteremo e che risulta molto utile per memorizzare dati: stiamo parlando dell’elaborazione dei file. La memorizzazione dei dati nelle variabili e nei vettori è temporanea, i dati vengono eliminati appena il programma termina la sua esecuzione. Per questo esistono i file che ci permettono di memorizzare permanentemente una grande quantità di dati. Questi file vengono immagazzinati nei dispositivi di memoria secondaria del computer, principalmente su quelli a dischi. Vi spiegheremo come si creano i file e come possiamo modificarli, ma prima facciamo una breve digressione sulla struttura dei dati. I dati vengono memorizzati nel computer nella loro forma di basso livello, ovvero, in bit ( “binary digit”: un numero che può assumere come valore 0 o 1), ma al programmatore risulta complicato e sostanzialmente impossibile lavorare con i numeri binari e per questo usiamo numeri decimali, lettere e simboli speciali che insieme formano i caratteri. I campi sono composti da caratteri, così come questi ultimi sono composti da bit. Un campo è un gruppo di caratteri che può trasmettere un’informazione. Un record (una struct in C) è un gruppo di campi correlati, e un file è un gruppo di record correlati. Dunque il file si presenta come un magazzino dove vengono raggruppati un tot numero di record.

Il C vede tutti i file come un flusso sequenziale di bytes (stream). Ogni file finisce con un marcatore di fine file. Quando apriamo un file, gli viene associato un flusso. Tre file saranno aperti automaticamente all’apertura di un nuovo programma: lo standard input, lo standard output e lo standard error. I flussi logici di dati o stream forniscono un canale di comunicazione tra i file e i programmi. Per essere più chiari, lo stream dello standard input consente a un programma di leggere i dati dalla tastiera, mentre quello standard output fa sì che il programma possa visualizzare i dati sullo schermo. Per poter scrivere dati sui file o leggerli, la libreria standard ci viene incontro e ci offre delle funzioni utili per questi utilizzi. La funzione fgetc, come getchar, legge un carattere da un file mentre la funzione fputc, come putchar, scrive un carattere in un file. Tra le funzioni usate per scrivere e leggere i dati non sono da meno le funzioni fscanf e fprintf che svolgono compiti uguali a quelle illustrate poco fa (vedremo meglio queste funzioni nell’articolo successivo).
Come sempre gli esempi sono il modo migliore per digerire i concetti pesanti e per questo motivo ve ne proponiamo uno. Creeremo un file ad accesso sequenziale che potrebbe essere usato in un sistema di contabilità del credito. Per ogni cliente il programma otterrà il suo numero di conto, il suo nome e il bilancio del suo conto (saldo). I dati ottenuti per ognuno costituiranno il record dedicato ad ognuno di loro. In questo programma il numero di conto verrà usato come chiave del record: dunque il file sarà creato e ordinato rispetto a quel dato.

#include<stdio.h>

int main (void) {

int numeroconto;
char nome [30]; // nome dell'intestatario del conto
double saldo; // bilancio del conto

FILE *cf // puntatore al file clienti.dat

/* fopen apre il file. Se non riesce a creare il file,
provoca l'uscita del programma */

if ((cf = fopen( "clienti.dat", "r") ) == NULL)
{

printf("Il file non è stato creato\n");

}
else 
{

printf("Inserisci il numero conto, il nome e il saldo");
printf("Inserisci EOF (end of file) per terminare l'input.\n");
printf("?");
scanf("%d%s%f", &numeroconto, nome, &saldo);


while(!feof(stdin)) 
{

fprintf(cf, "%d %s %f\n", numeroconto, nome, saldo);
printf("?");
scanf("%d%s%f", &numeroconto, nome, &saldo);

}

fclose(cf); //fclose chiude il file

}

return 0;
}

Analizziamo nel dettaglio il programma per chiarire alcune parti che a prima vista potrebbero sembrare incomprensibili.
cf è un puntatore a una struttura FILE. Ogni file aperto deve avere un puntatore di tipo FILE che sarà usato per puntare se stesso. L’istruzione fopen(“clienti.dat”, “w”) assegnerà un nome al file che verrà usato dal programma e stabilirà una linea di comunicazione con esso. La funzione fopen riceve due argomenti: un nome e un modo di apertura del file. Il modo di apertura “w” indica che il file dovrà essere aperto in scrittura. Nel caso il file non esista e venga aperto in scrittura, fopen lo creerà. Invece nel caso in cui il file esistesse e fosse aperto in modalità scrittura, allora, tutti i dati all’interno saranno eliminati senza alcun avviso. Il comando if ci servirà per verificare se il file è stato creato correttamente, in caso contrario verrà visualizzato sullo schermo un messaggio di errore, terminando l’esecuzione del programma. Quando parliamo di EOF intendiamo End Of File, ovvero una combinazione di tasti che interrompono l’azione che si compie all’interno del file. Per i sistemi windows la combinazione di tasti è questa : ctrl + z , mentre per i sistemi Linux usate questa combinazione: ctrl + d. Il while continuerà la propria esecuzione fino a quando non sarà stato impostato l’indicatore di end of file. L’istruzione fprintf(cf, “%d %s %f\n”, numeroconto, nome, saldo) scriverà i dati nel file clienti.dat. La funzione fprintf è equivalente alla printf, eccetto che fprintf riceve come argomento anche un puntatore al file in cui saranno scritti i dati.

Per chiudere questa prima parte sui file vi allego le modalità nelle quali i file possono essere aperti.
Cattura

Per oggi è tutto, se avete domande non temete e scriveteci pure!

Please follow and like us: