Perchè i files? Realizzano la persistenza dei dati dati che sopravvivono all esecuzione del programma Sono delle strutture di dati sequenziali
Files e S.O. I files sono gestiti dal S.O. e resi visibili all interno del linguaggio per essere manipolati attraverso le funzioni di libreria da questo definite In C anche le periferiche (terminali, stampanti) vengono viste come files Per essere usato, un file deve essere aperto
Files binari o di testo Un file binario è una sequenza di byte che non viene "interpretata" Un file di testo è una sequenza di caratteri "interpretata"; alcuni rappresentano separatori (il carattere di newline viene interpretata dalla stampante come "salto alla riga successiva")
Rappresentazione interna Ciascun file ha un descrittore nella tabella dei files aperti Il descrittore memorizza modalità d uso (Read, Write) posizione corrente indicatore di errore in R/W indicatore di eof (end-of-file)
descrittori Rappresentazione interna
Dichiarazione e apertura E un puntatore al descrittore: FILE * fp Apertura del file FILE *fopen(nomefile, modalità) nomefile e modalità sono stringhe nomefile dà il percorso corrente o il nome è interpretato nel direttorio in cui si lancia l eseguibile apre file o crea se inesistente modalità di apertura (v.dopo il significato dei parametri) r lettura modalità testo, posizionamento inizio file w scrittura modalità testo, posizionamento inizio file a scrittura in modalità testo, posizionamento fine file (append) rb, wb e ab (c.s. ma binaria)
Rimozione, ridenominazione e chiusura int remove(nomefile) cancella file nomefile restituisce 0 se buon fine,!=0 altrimenti int rename(vecchionome, nuovonome) cambia nome al file restituisce 0 se buon fine,!=0 altrimenti int fclose(file *fp) fp diventa NULL, descrittore di tipo FILE rilasciato restituisce 0 se buon fine, altrimenti EOF
Gestione errori int ferror (FILE * fp) restituisce 0 (falso) se NON è stato commesso errore int feof (FILE * fp) restituisce 0 (falso) se NON si è alla fine void clearerr (FILE * fp) riporta al valore normale gli indicatori di errore e eof
Lettura e scrittura 4 modi possibili precisando formato carattere per carattere per linee di testo usuale per files di testo per blocchi Vediamo queste!!
Lettura/scrittura formattata scanf e printf fanno riferimento a stdin e stdout fprintf e fscanf fanno riferimento a file generici e si usano esattamente come scanf e printf int fprintf (FILE *fp, stringa_di_controllo, elementi); int fscanf(file *fp, stringa_di_controllo, indirizzo elementi); restituiscono il numero di elementi effettivamente letti o scritti o zero se errore
Lettura/scrittura caratteri int getchar (void) legge come intero un carattere da std input int putchar (int c) scrive carattere su std output int fgetc (FILE* fp) int fputc (int c, FILE* fp) leggono e scrivono carattere su file, restituendolo come intero
Legge e mostra a video un file #include <stdio.h> #include <stddef.h> main() { FILE *fp; char c; fp = fopen("filechar", "r"); /* file lettura, modalità testo */ if ( fp!= NULL ) { c = fgetc(fp); while (c!= EOF) { putchar(c); c = fgetc(fp); } fclose(fp); } else printf("il file non può essere aperto\n");
Esercizi Si scriva un programma C opportunamente scomposto in funzioni e procedure che permetta all utente di inizializzare una matrice di interi di dimensione NxN (con N dato) con numeri positivi. Dopo aver stampato la matrice a video, il programma deve trovare il minimo di tutti i valori inseriti nella matrice e stampare in un file di nome risultato.txt tale valore. Ad esempio, dato N=4, se l utente inserisse la seguente matrice: 11 42 0 47 55 3 45 12 2 23 55 55 1 5 7 0 Il programma, dopo averla visualizzata a video, dovrebbe scrivere nel file risultato.txt il numero 0. N.B. nella codifica del programma non si devono usare variabili globali.
Procedura scrittura file void ScrivisuFile(int max, FILE *fp) { if ((fp=fopen( risultato.txt, w ))==NULL) printf( Errore in apertura del file! ); else { fprintf(fp, %d, max); fclose(fp); } }
Esercizi Si scriva un programma C opportunamente scomposto in funzioni e procedure che permetta all utente di inizializzare una matrice di interi di dimensione NxN (con N dato) con numeri positivi compresi tra 0 e 99 (estremi inclusi). Dopo aver stampato la matrice a video, il programma deve contare le occorrenze di tutti i valori inseriti nella matrice e stampare in un file di nome risultato.txt il valore che nella matrice ha il maggior numero di occorrenze. Ad esempio, dato N=4, se l utente inserisse la seguente matrice: 11 42 0 47 55 3 45 12 2 23 55 55 1 5 7 0 Il programma, dopo averla visualizzata a video, dovrebbe scrivere nel file risultato.txt il numero 55 che nella matrice appare 3 volte. Se la matrice contiene più numeri la cui occorrenza è pari alla massima, il programma ne scriverà uno solo su file. N.B. nella codifica del programma non si devono usare variabili globali.