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