GESTIONE FILE (CAPITOLO 9)
Il FILE è un contenitore di informazione situato nella memoria secondo una struttura gerarchica.
Esempio: X:\Windows\System\info.txt
Nell’esempio su citato:
X -> Rappresenta il ROOT;
Windows -> Cartella all’interno del root (PART NAME);
System -> Sottocartella di Windows (PART NAME);
Info.txt -> File di testo indicato dall’indirizzo (FILE NAME).
Per quanto riguarda il nome file i sistemi operativi meno recenti permettevano di allocare 8 caratteri
per la parte nome e 3 caratteri per la parte estensione. Tuttavia le ultime versioni dei sistemi
operativi permettono all’utente di memorizzare nomi cartelle e/o file più lunghi salvando la parte
aggiuntiva agli 8 caratteri all’interno del file stesso.
.txt -> è detta estensione del file.
L’estensione è un indicatore del tipo di file e richiama il programma esecutore di tale tipo; alcuni
esempi di estensione file sono:
-
txt (File di testo);
doc (File documents);
xls (File di excel);
Tiff, jpg, png (File di immagine).
Vi sono tuttavia alcune estensioni riservate al sistema operativo, parliamo di:
-
.bat (E’ un file di testo che contiene comandi direttamente interpretabili dal processore);
.exe (File eseguibile);
.com (File eseguibile, non rilocabile come ad esempio i driver periferica).
Ricordiamo inoltre che nella memoria di massa il tipo di accesso ai file è per blocchi a differenza
della memoria centrale nella quale si accede mediante indirizzi.
Vi sono quattro principali operazioni associate all’utilizzo dei file, esse sono racchiuse
nell’acronimo CRUD (Create, Read, Update, Delete). L’accesso ai file può avvenire in due modi:
1) LOW LEVEL ACCESS (Modalità binaria);
2) LIBRARIES (Database relazionali);
L’accesso tramite librerie si divide in accesso con persistenza (I dati sopravvivono anche nel
momento in cui andiamo a chiudere la sessione di utilizzo del programma) e accesso mediante
database.
Durante l’utilizzo del file esso è accompagnato dall’esecuzione di 3 ulteriori file standard:
-
Standard Input (Tastiera);
Standard Output (Schermo);
Standard Error (Visualizza su schermo errori durante l’esecuzione).
Soffermiamoci sulle operazioni di gestione file in C. Includiamo in questo gruppo le funzioni di
apertura, chiusura, rimozione e ridenominazione di un file.
Il file si apre in questo modo:
FILE *fopen(nome file, modalità) //L’asterisco indica che il contenuto di fopen è un file.
Le operazioni svolgibili sul file sono:
-
-
int fclose (FILE *fp); //Chiude il file cui fa riferimento fp
int remove (nomefile); //Rimuove il file identificato da nomefile. Restituisce 0 se
l’operazione è stata eseguita correttamente, altrimenti restituisce
EOF
int rename(vecchionome, nuovonome). //Modifica il nome di un file da vecchionome a
nuovo nome.
Vi sono due campi che registrano una generica situazione di errore o il verificarsi della condizione
“è stata raggiunta la condizione di fine file”, parliamo di error ed EOF.
Il programmatore può controllare il contenuto di tali campi tramite due funzioni presenti nella
standard library:
-
-
int ferror (FILE *fp); //Controlla la presenza di errori nelle precedenti operazioni di lettura e
scrittura. Restituisce 0 se non ci sono errori
int feof (FILE *fp); //Verifica se è stata raggiunta la fine del file nella precedente
operazione di lettura e scrittura. Restituisce 0 se la condizione non è
stata raggiunta.
void clearerr (FILE *fp). //Resetta i campi feof ed error
Le funzioni fprintf e fscanf consentono operazioni formattate analoghe a quelle di scanf e printf, ma
oltre lo standard output (schermo) coinvolgono anche il file indicato dall’utente. Si strutturano nel
seguente modo:
-
int fprintf (FILE *fp, stringadicontrollo, elementi);
int fscanf (FILE *fp, stringadicontrollo, indirizzoelementi).
Sei funzioni della standard library consentono la lettura e la scrittura di caratteri su file:
-
int getchar (void); //Preleva i caratteri uno alla volta
int putchar(int c); //Scrive un carattere alla volta
int putc (int c, FILE *fp);
int getc (FILE *fp);
int fgetc (FILE *fp);
-
int fputc (int c, FILE *fp).
Queste ultime quattro funzioni sono equivalenti alle prime due, ma richiedono un uso esperto del C.
E’ possibile accedere in lettura o scrittura ai dati di un file leggendo o scrivendo un intero blocco di
dati testuali o binari tramite le funzioni:
-
-
int fread (void *ptr, dimelemento, numelementi, FILE *fp); //Legge un blocco di dati dal file
cui fa riferimento fp e li memorizza nel vettore identificato da ptr. La funzione termina se
legge il numero di byte richiesti, se incontra la fine del file o si verificano errori di lettura.
La funzione restituisce il numero di elementi letti.
int fwrite (void *ptr, dimelemento, numelementi, FILE *fp); //Scrive un blocco di dati dal
file cui fa riferimento fp prelevandoli dal vettore identificato da ptr. La funzione termina se
scrive il numero di byte richiesti, se incontra la fine del file o si verificano errori di scrittura.
La funzione restituisce il numero di elementi scritti.
In alcuni casi può tornare utile accedere direttamente a un particolare byte all’interno di un file.
Questo tipo di acceso è detto accesso diretto ed è usufruibile grazie alle funzioni:
-
-
int fseek (FILE *fp, long offset, int refpoint); //Sposta l’indicatore di posizione per
effettuare accessi diretti al file cui fa riferimento fp. Questa funzione si può seguire in tre
modalità, seekset consente di indicare la posizione a partire dall’inizio del file, seekcur
consente di indicare la posizione a partire dalla posizione corrente, seekend consente di
indicare la posizione a partire dalla fine del file
long ftell (FILE *fp). //Restituisce il valore corrente dell’indicatore di posizione del file
specificato.
Vi è inoltre una funzione chiamata rewind che consente di alterare il valore di posizione corrente in
un file assegnandogli il valore di inizio file. Differisce da fseek perché non restituisce alcun valore.
DATA: 21/05/2014
Salvatore Piccinno
Luca Vigna
Scarica

21Maggio_Piccinno