I File - WordPress.com
Transcript
I File - WordPress.com
DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA INFORMATICA B Ingegneria Elettrica I file in Matlab I file DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • I file sono “contenitori” di informazione: sequenze di byte associate ad un nome • Sono memorizzati su memoria di massa (non-‐volatile) • Possono continuare ad esistere indipendentemente dalla vita del programma che li ha creati • Possono essere acceduti da più programmi • Organizzano l’informazione in maniera sequenziale 2 I file DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • Il sistema operativo si occupa della loro gestione e offre ai programmi una serie di operazioni per § creazione/cancellazione di file § scrittura/lettura § controllo dei casi di errore • Ci sono due tipi fondamentali di file: § File binari: sequenza di byte § File testuali: sequenza di caratteri, suddivisi in linee terminate da un carattere di a-‐capo (newline); ciascun byte è la codifica ASCII di un carattere alfanumerico (alcuni caratteri possono essere caratteri di controllo non stampabili) 3 I file ed il sistema operativo DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • I file sono gestiti dal sistema operativo (gestione del file system) • Il sistema operativo § Risolve la corrispondenza tra nome del file e tracce/settori del disco in cui è memorizzato § Invia i comandi al drive del disco (interfaccia di I/O) per leggere da o scrivere su file (trasferimento tra memoria di massa e memoria centrale) • Per organizzare in modo conveniente grandi quantità di file, questi sono raccolti in directory (cartelle) • Ogni file ha un nome e si trova in una cartella (identificata da un percorso, o path) 4 Descrittore del file DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • Per ogni file aperto il sistema operativo gestisce un descrittore di file • Il descrittore contiene le seguenti informazioni: § Modalità di utilizzo di un file (lettura, scrittura, append...) § Posizione corrente nel file § Stato dell’accesso (errore) • Tutti i descrittori di file sono memorizzati nella tabella dei file aperti 5 Lettura e scrittura di file DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • Matlab è in grado di gestire § File di testo (ASCII) § File binari (hanno estensione .mat) • Comandi di alto livello per leggere e scrivere dati in un file § load § save 6 Salvataggio su file DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • save <nomefile> salva nel file nomefile.mat tutte le variabili contenute nello spazio di lavoro • save <nomefile> array1 array2 salva nel file solo le variabili array1 ed array2 • I file .mat contengono § Il nome, il tipo, la dimensione ed il valore di ciascuna variabile nello spazio di lavoro § Possono essere trasferiti da un computer ad un altro, anche con sistemi operativi diversi ma possono essere aperti solo da Matlab 7 Salvataggio su file DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • È possibile anche salvare i dati in formato ASCII (file di testo) • Il comando x= [3, 5.5; 4, 5] save –ascii nomefile.dat x; Produce un file nomefile.dat con il seguente contenuto: 3.0000000e+00 5.5000000e+00 4.0000000e+00 5.0000000e+00 • Nota: si può utilizzare qualsiasi estensione per i file di testo ma è consigliato evitare di utilizzare l’estensione .mat 8 Lettura da file DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • load <nomefile.mat> carica nello spazio di lavoro tutte le variabili contenute nel file binario .mat • load <nomefile.mat> x y carica nello spazio di lavoro solo le variabili specificate • load <nomefile.dat> crea una variabile nomefile che conterrà in una matrice tutti i dati letti dal file di testo § Il file deve contenere i dati separati da virgole e spazi ed a-‐capo 9 Lettura da file DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • a=xlsread('nomefile') importa il contenuto del file MS Excel nomefile.xls nella matrice a • Alcuni fogli di calcolo utilizzano il formato .wk1 a=wk1read('nomefile') 10 Lettura da file DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA [a b c ...] = textread (filename, formato, n) • Legge file ASCII organizzati in tabelle • filename è il nome del file da leggere • formato è specificato come nella fprintf • n è numero di righe da leggere. Se omesso, textread legge fino alla fine del file • a, b, c,... sono i vettori colonna in cui verranno caricati i dati 11 Gestione avanzata dei file DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • In ambiente Matlab e C, per utilizzare un file all’interno di un programma è necessario: § Aprire un “flusso di comunicazione”, cioè aprire il file § Accedere a file in lettura e/o scrittura § Chiudere il “flusso di comunicazione”, cioè chiudere il file • Se un file viene aperto in una certa modalità (binario o testuale): le operazioni sul file devono essere effettuate in modo congruente, tenendo conto del tipo di file § Se creo un file in formato binario devo leggerlo sempre in formato binario § Stessa cosa vale per i file di testo 12 Gestione avanzata dei file DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • Apertura di un “flusso di comunicazione” con il file fid = fopen(nome, modalità) § modalità è una stringa specificata secondo un formato predeterminato § fid è un intero che indica il descrittore del file • Scrittura/lettura nel/dal file § fwrite, fprintf, fread, fscanf • Chiusura del flusso di comunicazione § status = fclose(fid) 13 fopen DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA [fid msg] = fopen(nome, modalità) • È la funzione per l’apertura del file • Apre un flusso di comunicazione con il file il cui nome viene specificato come parametro • Riceve in ingresso § il nome del file da aprire (può includere il percorso nel file system) e § il modo in cui lo si vuole aprire • Restituisce un identificatore numerico per la gestione del file 14 fopen DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • Alla chiamata della funzione il sistema operativo crea un nuovo descrittore di file nella tabella dei file aperti • Inizializza i campi del descrittore • Restituisce l’identificatore fid di tale descrittore § fid rappresenta il nome logico del file, associato al nome fisico indicato come parametro della fopen • Una volta aperto il file, questo può essere acceduto indicando il solo nome logico 15 fopen DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • Restituisce -‐1 ed un messaggio di errore se il flusso di comunicazione non è stato aperto, e cioè: § Il file aperto in lettura non esiste oppure è protetto da lettura § Il file aperto in scrittura è protetto da scrittura oppure è protetta da scrittura l'unità di memoria su cui si trova oppure lo stesso file è aperto da un altro programma § Se si verifica un errore nell’interazione con il supporto di memorizzazione su cui il file risiede • Controllare sempre il risultato di fopen() 16 fopen DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • 'r': apre un file esistente in lettura • 'w': apre un file esistente o crea un nuovo file in scrittura con distruzione di quanto già presente nel file • 'a': apre un file esistente o crea un nuovo file in scrittura con posizionamento alla fine del file. • 'rt': come 'r' ma in modalità testuale • 'wt': come 'w' ma in modalità testuale • 'at': come 'a' ma in modalità testuale • 'r+' e 'rt+': come 'r'/'rt' ma si può anche scrivere nel file • 'w+' e 'wt+': come 'w'/'wt' ma si può anche leggere dal file • 'a+' e 'at+' : come 'a'/'at' ma si può anche leggere dal file 17 fclose DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA status = fclose(fid) • Determina la chiusura del flusso di comunicazione con il file identificato da fid • Restituisce 0 se la chiusura è avvenuta senza errori, il valore -‐1 in caso di problemi status = fclose('all') • Chiude tutti i file 18 Lettura e scrittura nel file DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • La modalità e le funzioni per la lettura e la scrittura da file dipendono dal tipo di file § Binario: fwrite/fread § Testuale: fprintf/fscanf • Se il file è testuale i caratteri letti/scritti possono essere soggetti ad interpretazione § Per esempio i caratteri di spazio o a-‐capo sono spesso considerati dei separatori tra i valori • Se il file è binario i caratteri letti/scritti non sono interpretati § Quindi se leggo il carattere con codice ASCII 10 in un file binario viene letto proprio il carattere con codice 10 19 Lettura e scrittura nel file DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • La lettura e la scrittura devono essere operazioni simmetriche § Esempio: se ho scritto in un file binario 5 numeri double, dovrò leggere 5 numeri double e non 5 numeri interi • La struttura delle informazioni inserite in un file è definita da chi crea il file • Questa struttura indica il formato del file • La lettura deve rispettare questa struttura 20 Accesso sequenziale ai file DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA L’accesso ai file è affine a quello delle vecchie audiocassette e videocassette: 1. fprintf / fwrite 2. rewind 3. fseek 4. fscanf / fread 5. fseek 21 Accesso sequenziale ai file DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • La posizione corrente indica il punto da dove si leggerà (o dove si scriverà) • L’indicatore di posizione corrente si sposta in avanti dopo ogni lettura/scrittura • Esistono operazioni per spostare la posizione corrente in avanti o indietro senza leggere o scrivere (per esempio fseek) • Il file non ha dimensioni prefissate. La sua dimensione massima dipende dalla dimensione della memoria di massa e dal file system 22 fwrite DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA cont = fwrite(fid,array,formato) • cont indica il numero di valori effettivamente scritti nel file • fid è identificatore del file su cui scrivere (il file deve essere stato aperto in precedenza) • array contenente i dati da salvare • formato specifica il formato in cui i dati verranno salvati § Formati principali: char, int8, int16, int32, int64, float32, float64 (i numeri indicano il numero di bit usati per rappresentare i valori) § formato è facoltativo • La scrittura di una matrice viene effettuata per colonne 23 fread DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA [array cont]=fread(fid, dim, formato) • I dati letti vengono memorizzati in array • cont indica il numero di valori effettivamente letti dal file • fid è identificatore del file da cui leggere (il file deve essere stato aperto in precedenza) • dim è la dimensione dei dati da leggere: § n: legge esattamente n valori § Inf: legge fino alla fine del file § [n m]: legge esattamente n*m valori. Dopo l’esecuzione di questa istruzione array sarà una matrice n*m contenente tutti i valori letti • formato specifica il formato in cui i dati verranno letti § Formati principali: char, int8, int16, int32, int64, float32, float64 (i numeri indicano il numero di bit usati per rappresentare i valori) § formato è facoltativo 24 Esempi di scrittura/lettura di un file binario DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA a=1:10; filename=input('inserisci un nome di file ', 's'); [fid msg]=fopen(filename, 'w'); if(fid>0) cont=fwrite(fid, a, 'int32'); disp([num2str(cont) ' valori scritti...']); fclose(fid); else disp('errore!'); end 25 Esempi di scrittura/lettura di un file binario DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA filename=input('inserisci un nome di file ', 's'); [fid msg]=fopen(filename, 'r'); if(fid>0) [vett cont]=fread(fid, Inf, 'int32'); disp([num2str(cont) ' valori letti...']); fclose(fid); else disp('errore!'); end 26 feof DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA status = feof(fid) • La funzione restituisce 1 se abbiamo raggiunto la fine del file (cioè se abbiamo fatto una lettura oltre l’ultimo dato valido) • Esempio: ... [a cont]=fread(fid, 1, 'float64'); while ~feof(fid) fprintf('numero: %c\n',a); [a cont]=fread(fid, 1, 'float64'); end ... • Il controllo di fine file può essere effettuato anche verificando se cont è minore della quantità di dati che si voleva leggere (esempio: cont==0) 27 fprintf DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA cont = fprintf(fid, formato, var1, var2, ...) • fprintf può essere utilizzata anche per scrivere su file • Va specificato come primo parametro il descrittore del file fid a=rand(1,1000); filename=input('inserisci un nome di file '); [fid msg]=fopen(filename, 'wt'); if(fid>0) for i=1:1000 fprintf (fid, '%f\n',a(i)); end fclose(fid); else disp('errore!'); end 28 fscanf DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA [array cont]=fscanf(fid, formato, dim) • I dati letti vengono memorizzati in array • cont indica il numero di valori effettivamente letti dal file • fid è identificatore del file da cui leggere (il file deve essere stato aperto in precedenza) • formato: è la stringa di formato (uguale a quella della fprintf) • dim è la dimensione dei dati da leggere: § n: legge esattamente n valori § Inf: legge fino alla fine del file § [n m]: legge esattamente n*m valori. Dopo l’esecuzione di questa istruzione array sarà una matrice n*m contenente tutti i valori letti 29 fscanf DIPARTIMENTO DI ELETTRONICA, INFORMAZIONE E BIOINGEGNERIA • fscanf ha lo stesso prototipo e funzionamento della fread ma su file testuali • Si consideri un file testuale contenente i seguenti dati il cui descrittore è contenuto in fid: 10.00 20.00 30.00 40.00 • La scanf può essere utilizzata per costruire diverse strutture dati dai valori contenuti nel file: § [z • § [z • cont] = fscanf(fid, '%f'); z è un array: z=[10 20 30 40] cont] = fscanf(fid, '%f', [2 2]); z è una matrice: z=[10 20; 30 40] 30