Lezioni di Informatica
"Una volta che abbiate conosciuto il volo, camminerete sulla terra guardando il cielo" [ L. da Vinci ]
Informazioni sul Sito
N. visitatori  000069280  dal 21/01/2007  |   e-mail: ksoft64camera@gmail.com   
Cerca nel sito
Documenti collegati alla pagina
File

Generalità: file, record e campi

Con il termine file si intende qualsiasi informazione che viene archiviata su una memoria di massa (hard disk, floppy, memoria USB, ...).
Esistono diversi tipi di file (binari, di testo, multimediali, ...). Noi ci occuperemo di quella tipologia che attiene maggiormente a problemi gestionali. Questi file non sono altro che insiemi di record tutti aventi la stessa struttura.
A sua volta ogni record si suddivide in campi, ovvero contenitori che possono essere di vario tipo.

Per gestire i file occorre seguire i seguenti passi:

Definizione delle strutture generiche

Per definire una struttura informativa astratta si utilizza il seguente costrutto generico:
struct struttura_astratta
{
	tipo campo_1;
	tipo campo_2;
	...
	...
	tipo campo_n;
};
Successivamente si definisce un nuovo tipo di dato collegato alla struttura astratta:
typedef struct struttura_astratta nuovo_tipo;
Dopo aver creato il nuovo tipo di dato, questo può essere utilizzato per dichiarare variabili personalizzate che serviranno come memoria di transito (Buffer in memoria RAM) per le informazioni da leggere o scrivere su memoria di massa.
Si procede così:
nuovo_tipo variabile_buffer;
Infine la variabile utilizzata per rappresentare il file sarà dichiarata di tipo puntatore nel seguente modo:
FILE * variabile_file;

Un esempio concreto

Supponiamo di voler definire la struttura per registrare i dati dei clienti. Seguendo le indicazioni del paragrafo precedente, si procede così:
Per definire la struttura informativa astratta si utilizza il seguente costrutto generico:
struct cliente
{
	char cognome[30];
	char nome[30];
	char indirizzo[30];
	char partitaIVA[11];
};
Successivamente si definisce il nuovo tipo di dato collegato alla struttura astratta:
typedef struct cliente tipo_cliente;
Utilizziamo tipo_cliente per dichiarare la variabile buffer per le informazioni da leggere o scrivere su memoria di massa.
Si procede così:

tipo_cliente rec_cliente;
Infine la variabile utilizzata per rappresentare il file sarà dichiarata di tipo puntatore nel seguente modo:
FILE * f_clienti;

Apertura e chiusura file

Aprire un file significa consentire all'utente di accedere ad un archivio in memoria di massa per crearlo, modificare i campi di un record, cancellare record, visualizzare i record secondo diversi criteri.
L'istruzione è fopen() ed è una funzione che necessita di 2 parametri: il nome del file fisico e la modalità di apertura o accesso.
file_logico=fopen("file_fisico", "modalità");
Per chiudere l'accesso a un file si utilizza fclose(file_logico);
Esistono diverse modalià di apertura del file. Tra le più importanti abbiamo:
  • "w" significa write=scrittura. Se il file non esiste viene creato. Se esiste viene svuotato per consentire la riscrittura
  • "a" significa append=accodamento. Se il file non esiste viene creato. Se esiste non viene alterato il contenuto ma il file system si colloca dopo l'ultimo record inserito per continuare a scrivere
  • "r" significa read=lettura. Se il file non esiste viene segnalato un errore e il programma si ferma, altrimenti il file viene aperto per essere letto in sequenza dal primo all'ultimo record
Esempi concreti di apertura:
f=fopen("clienti","w");
f=fopen("clienti","a");
f=fopen("clienti","r");

Registrazione di record nel file

Se il file viene aperto in modalità "w" oppure "a" è possibile scrivere dei record in esso. L'istruzione per scrivere è la funzione fwrite(), la cui struttura generica è:
fwrite(&buffer, dimensione, numero di elementi, file logico);
Il seguente programma registra un cognome e un nome, inseriti da tastiera, nel file "Clienti" in aggiunta agli altri clienti registrati precedentemente:
#include <stdio.h>
struct cliente
{
    char cognome[20];
    char nome[20];
};

typedef struct cliente rec_cli;

rec_cli rc;
FILE *f;

main()
{
    f=fopen("Clienti", "a");
    printf("Cognome: ");
    scanf("%s",rc.cognome);
    printf("Nome: ");
    scanf("%s",rc.nome);
    
    fwrite(&rc, 40, 1, f);
    fclose(f); 
}

Lettura di record dal file

Se il file viene aperto in modalità "r" è possibile leggere dei record da esso. L'istruzione per leggere è la funzione fread(), la cui struttura generica è:
fread(&buffer, dimensione, numero di elementi, file logico);
Il seguente programma visualizza i cognomi e i nomi leggendoli dal file "Clienti":
#include <stdio.h>
struct cliente
{
    char cognome[20];
    char nome[20];
};

typedef struct cliente rec_cli;

rec_cli rc;
FILE *f;

main()
{
    f=fopen("Clienti", "r");
    fread(&rc, 40, 1, f);
    while(! feof(f))
    {
    	printf("%-20s %-20s \n", rc.cognome, rc.nome);
    	fread(&rc,40,1,f);    
    }
    fclose(f); 
}
Note al programma:
  • La funzione feof() controlla che non si sia raggiunta la fine del file (end of file=eof). In tal caso il ciclo while di lettura viene interrotto
  • La funzione fread() iniziale controlla che il file non sia vuoto. L'altra viene eseguita ciclicamente fino alla fine del file.