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