Gestione File: differenze tra le versioni
(→Posizionamento nel file) |
(→Posizionamento nel file) |
||
Riga 141: | Riga 141: | ||
* ''fseek'' -> ''status'' = fseek(''fileID'', ''offset'', ''origin'') muove l'indicatore di posizione all'interno del file indicato da ''fileID'' a ''offset'' bytes dall'origine ''origin'' specificata. Il valore di ''status'' è 0 quando l'operazione va a buon fine, altrimenti è -1. Relativamente all'''origin'' esistono delle macro che identificano posizioni specifiche all'interno del file; in particolare ci sono: | * ''fseek'' -> ''status'' = fseek(''fileID'', ''offset'', ''origin'') muove l'indicatore di posizione all'interno del file indicato da ''fileID'' a ''offset'' bytes dall'origine ''origin'' specificata. Il valore di ''status'' è 0 quando l'operazione va a buon fine, altrimenti è -1. Relativamente all'''origin'' esistono delle macro che identificano posizioni specifiche all'interno del file; in particolare ci sono: | ||
− | ** ''' 'bof' ''' | + | ** ''' 'bof' ''' Beginning of file |
− | ** ''' ' | + | ** ''' 'cof' ''' Current position in file |
− | ** ''' ' | + | ** ''' 'eof' ''' End of file |
+ | Ulteriori dettagli sono presenti nella relativa pagina della [https://it.mathworks.com/help/matlab/ref/fseek.html documentazione] | ||
* ''ftell'' | * ''ftell'' | ||
* ''rewind'' | * ''rewind'' |
Versione delle 10:57, 5 dic 2016
Vitoantonio Bevilacqua vitoantonio.bevilacqua@poliba.it
Antonio Brunetti antonio.brunetti@poliba.it
Gianpaolo Francesco Trotta gianpaolofrancesco.trotta@poliba.it
Sommario. Il presente paragrafo si riferisce alle lezioni del I Modulo di Informatica : Fondamenti di Informatica per il nuovo corso di laurea triennale in Ingegneria dei Sistemi Medicali del Dipartimento di Ingegneria Elettrica e dell'Informazione del Politecnico di Bari.
Parole chiave: Input/Output, File di testo, File Binari.
ATTENZIONE !!! - PAGINA IN ALLESTIMENTO
Indice
Introduzione
La lettura da tastiera, cosi come la stampa a video, non sono gli unici modi di gestire l'input/output in Matlab. Infatti, analogamente alle funzioni precedenti, esistono dei metodi che permettono la la scrittura e la lettura sui files. Il sistema di input/output del Matlab, cosi come molti altri linguaggi di programmazione (p.e. il C) fornisce un’interfaccia indipendente dal particolare dispositivo su cui viene eseguito l’accesso, poiché questo è associato ad un flusso di informazioni (stream).
Esistono due tipi di flussi che si comportano allo stesso modo:
- flussi di testo - sequenze di caratteri;
- flussi binari - una sequenze di byte con corrispondenza uno ad uno con quelli della periferica esterna.
Apertura e Chiusura di un file
L'operazione di apertura di un file, senza la quale non sarebbe possibile effettuare le altre operazioni, consente di accedervi e di associare ad esso uno specifico riferimento (o handle). Per poter utilizzare un file, quindi aprirlo, si utilizza la funzione fopen la cui sintassi è la seguente:
fileID = fopen(filename,permission)
dove fileID è il riferimento al file restituito dalla funzione fopen (-1 se l'operazione di apertura non va a buon fine), filename è la stringa contenente il nome (percorso) del file da leggere/scrivere, mentre permission permette di definire la modalità di accesso al file. Tutte le specifiche si trovano nella documentazione della funzione fopen; di seguito sono riportate le modalità più comuni di accesso al file.
permission | descrizione |
---|---|
'r' | Apertura del file in modalità lettura. |
'w' | Apertura del file in modalità scrittura. Se il file non esiste, viene creato; se il già file esiste, il suo contenuto viene perso. |
'a' | Apertura del file in modalità append. I dati inseriti vengono aggiunti a quelli già all'interno del file. |
'r+' | Apre il file in modalità lettura, ma consente anche operazioni di scrittura. |
'w+' | Apre il file in modalità scrittura, ma consente anche operazioni di lettura. |
'a+' | Apre il file in modalità append, ma consente anche operazioni di lettura. |
Una volta terminate le operazioni su un file, è buona prassi chiudere quel file. Per fare ciò si utilizza la funzione fclose la cui sintassi è la seguente:
fclose(fileID)
Lettura e scrittura formattata
Una volta aperto il file con la funzione fopen, avendo cura di scegliere la modalità opportuna, è possibile accedervi attraverso le seguenti funzioni:
- fprintf per scrivere sul file;
- fscanf per leggere da file.
Scrittura su file
fprintf(fileID, formatSpec, A1, ..., An)
La funzione fprintf scrive sul file indicato da fileID i dati contenuti negli elementi A1, ..., An formattato secondo formatSpec. Studiando la documentazione relativa alla funzione fprintf è possibile notare che esistono una moltitudine di operatori di formattazione. Tra i più comuni ci sono i seguenti:
Operatore | Descrizione |
---|---|
%d (o %i) | Intero con segno |
%f | Numero in virgola mobile |
%c (%s) | Singolo carattere (Stringhe) |
Lettura da file
A = fscanf(fileID, formatSpec, sizeA)
La funzione fscanf legge dal file indicato da fileID e salva il suo contenuto nella struttura dati A interpretandoli secondo lo l'operatore di formattazione indicato da formatSpec. Gli operatori di formattazione sono analoghi a quelli indicati nella sezione precedente. Ulteriori dettagli si possono trovare sulla documentazione ufficiale della funzione fscanf.
Lettura e scrittura in binario
Qualora siano richieste particolari caratteristiche di velocità ed efficienza per la scrittura su file, si dovrà fare ricorso alle funzioni di lettura e scrittura in modalità binaria. L'apertura e la chiusura di un file in modalità binaria sono analoghe a quelle descritte nella relativa sezione dei file di testo.
Una volta aperto il file con la funzione fopen, avendo cura di scegliere la modalità opportuna, è possibile accedervi attraverso le seguenti funzioni:
- fwrite per scrivere sul file;
- fread per leggere da file.
Scrittura su file
fwrite(fileID, A, precision)
La funzione fwrite scrive sul file indicato da fileID i dati contenuti nella struttura indicata con A secondo il formato specificato da precision. È necessario prestare attenzione a questo parametro in quanto è quello che permette di stabilire la classe e la dimensione in bits del valore da scrivere. Tutti i valori che può assumere precision sono riportati nella documentazione; di seguito ne sono riportati alcuni:
Tipo di valore | Precision | Bits (Bytes) |
---|---|---|
Intero (senza segno) | 'uint' | 32 (4) |
'uint8' | 8 (1) | |
Intero (con segno) | 'int' | 32 (4) |
'int8' | 8 (1) | |
Numeri con virgola mobile (floating point) | 'single' o 'float' | 32 (4) |
'double' | 64 (8) |
Lettura da file
A = fread(fileID, sizeA, precision)
La funzione fread legge i dati dal file indicato da fileID e gli salva nella struttura dati A, utilizzando la dimensione specificata da sizeA e interpretando tali valori secondo il formato specificato da precision. I valori che può assumere precision sono riportati nella documentazione e sono analoghi a quelli riportati nella sezione della scrittura su file binario.
Posizionamento nel file
Utilizzando determinate funzioni, è possibile spostarsi all'interno dei file. Le principali funzioni da tenere in considerazione sono:
- fseek -> status = fseek(fileID, offset, origin) muove l'indicatore di posizione all'interno del file indicato da fileID a offset bytes dall'origine origin specificata. Il valore di status è 0 quando l'operazione va a buon fine, altrimenti è -1. Relativamente all'origin esistono delle macro che identificano posizioni specifiche all'interno del file; in particolare ci sono:
- 'bof' Beginning of file
- 'cof' Current position in file
- 'eof' End of file
Ulteriori dettagli sono presenti nella relativa pagina della documentazione
- ftell
- rewind
Esempi Applicativi: File di testo
Scrittura su file
Si acquisiscono da tastiera gli elementi di un vettore di lunghezza pari a N; una volta acquisiti, scrivo tutti gli elementi su un file di testo nominato 'vettore.txt' nella directory corrente.
%% Scrittura file di testo
% Inizializzazione delle variabili
N = 10;
v = [];
% Acquisizione da tastiera degli elementi del vettore
for i = 1 : N
v(i) = input('');
end
% Apertura file in modalità scrittura
fileID = fopen('vettore.txt','w');
% In questo momento, se il file non esiste, viene creato
% Ciclo per la scrittura di tutti gli elementi sul file
for i = 1 : N
fprintf(fileID, '%d ', v(i));
end
% NB: prestare attenzione allo spazio in '%d '... è necessario affinché i numeri vengano stampati separati all'interno del file
% Chiusura del file
fclose(fileID);
%% Riferimenti utili
%
% # https://it.mathworks.com/help/matlab/ref/fopen.html
% # https://it.mathworks.com/help/matlab/ref/fprintf.html
% # https://it.mathworks.com/help/matlab/ref/fclose.html
%
Lettura da file
Esiste un file di testo, chiamato 'vettore.txt' che contiene N elementi interi. Si vuole leggere il file, salvare tutti gli elementi in esso contenuti in un vettore V e stampare a video tali elementi.
%% Lettura file di testo
% Inizializzazione delle variabili
N = 10;
V = [];
% Apertura del file in modalità lettura
fileID = fopen('vettore.txt','r');
for i = 1 : N
V(i) = fscanf(fileID, '%d', 1);
end
% Chiusura del file
fclose(fileID);
% Ciclo per la stampa a video degli elementi del vettore V
for i = 1 : N
disp(V(i));
end
%% Riferimenti utili
%
% # https://it.mathworks.com/help/matlab/ref/fopen.html
% # https://it.mathworks.com/help/matlab/ref/fscanf.html
% # https://it.mathworks.com/help/matlab/ref/fclose.html
%
Scrittura e Lettura da file
Si acquisiscono da tastiera gli elementi di un vettore di lunghezza pari a N; una volta acquisiti, scrivo tutti gli elementi su un file di testo nominato 'vettore.txt' nella directory corrente. Successivamente, si vogliono leggere gli elementi in 'vettore.txt' e salvarli in un vettore chiamato oggi, quindi stampare a video i suoi elementi.
%% Scrittura e lettura da file di testo
% Inizializzazione variabili
N = 10;
V = [];
% Acquisizione da tastiera delle componenti del vettore
for i = 1 : N
V(i) = input('');
end
% Apertura file in modalità scrittura
fileID = fopen('vettore.txt','w');
% Scrittura su file degli elementi del vettore V
for i = 1 : N
fprintf(fileID, '%d ', V(i));
end
% NB: prestare attenzione allo spazio in '%d '... è necessario affinché i numeri vengano stampati separati all'interno del file
% Chiusura del file
fclose(fileID);
% Inizializzazione del vettore oggi
oggi = [];
% Apertura del file in modalità lettura
fileID = fopen('vettore.txt','r');
% Lettura da file degli elementi del vettore
for i = 1 : N
oggi(i) = fscanf(fileID, '%d', 1);
end
% Chiusura del file
fclose(fileID);
% Stampa a video degli elementi del vettore
for i = 1 : N
disp(oggi(i));
end
%% Riferimenti utili
%
% # https://it.mathworks.com/help/matlab/ref/fopen.html
% # https://it.mathworks.com/help/matlab/ref/fscanf.html
% # https://it.mathworks.com/help/matlab/ref/fclose.html
%
Copia del contenuto di un file in un altro file
Esiste un file di testo, chiamato 'originale.txt' che contiene N elementi interi. Si vuole leggere il file e copiare tutti i suoi elementi in un altro file di testo chiamato 'copia.txt'.
%% Copia del contenuto di un file di testo in un altro file di testo
% Inizializzazione delle variabili
V = [];
N = 10;
% Apertura del file originale in modalità lettura
fileID = fopen('originale.txt','r');
% Ciclo per la lettura da file degli elementi del vettore
for i = 1 : N
V(i) = fscanf(fileID, '%d ', 1);
end
% Chiusura del file
fclose(fileID);
% Apertura del file copia in modalità scrittura
fileID = fopen('copia.txt','w');
% Ciclo per la stampa su file degli elementi del vettore V
for i = 1 : N
fprintf(fileID, '%d ', V(i));
end
% Chiusura del file
fclose(fileID);
%% Riferimenti utili
%
% # https://it.mathworks.com/help/matlab/ref/fopen.html
% # https://it.mathworks.com/help/matlab/ref/fscanf.html
% # https://it.mathworks.com/help/matlab/ref/fprintf.html
% # https://it.mathworks.com/help/matlab/ref/fclose.html
%
Calcolo del doppio delle componenti di un vettore
Esiste un file di testo, chiamato 'originale.txt' che contiene N elementi interi. Si vuole leggere il file e salvare in un altro file di testo, chiamato 'doppio.txt', il doppio degli elementi acquisiti.
%% Calcolo del doppio delle componenti di un vettore
% Inizializzazione delle variabili
V = [];
N = 10;
% Apertura dei file
fileIngresso = fopen('originale.txt','r');
fileUscita = fopen('doppio.txt','w');
% ATTENZIONE: è possibile gestire lettura, elaborazione e scrittura
% utilizzando un unico ciclo for
for i = 1 : N
V(i) = fscanf(fileIngresso, '%d ', 1);
V(i) = V(i) * 2;
fprintf(fileUscita, '%d ', V(i));
end
% Chiusura dei file
fclose(fileIngresso);
fclose(fileUscita);
%% Riferimenti utili
%
% # https://it.mathworks.com/help/matlab/ref/fopen.html
% # https://it.mathworks.com/help/matlab/ref/fscanf.html
% # https://it.mathworks.com/help/matlab/ref/fprintf.html
% # https://it.mathworks.com/help/matlab/ref/fclose.html
%
Calcolo della media delle componenti di un vettore
Esiste un file di testo, chiamato 'originale.txt' che contiene N elementi interi. Si vuole leggere il file e salvare in un altro file di testo, chiamato 'media.txt', la media degli elementi acquisiti.
%% Calcolo della media delle componenti di un vettore
% Inizializzazione delle variabili
N = 10;
somma = 0;
V = [];
% Apertura dei file
fileIngresso = fopen('originale.txt','r');
fileUscita = fopen('media.txt','w');
% Acquisizione degli elementi dal file
for i = 1 : N
V(i) = fscanf(fileIngresso, '%d ', 1);
somma = somma + V(i);
end
% Calcolo della media
media = somma / N;
% La media è un numero in virgola mobile, quindi si utilizza il %f (.2
% serve a specificare il numero di cifre dopo la virgola).
fprintf(fileUscita, '%.2f ', media);
% Chiusura dei file
fclose(fileIngresso);
fclose(fileUscita);
%% Riferimenti utili
%
% # https://it.mathworks.com/help/matlab/ref/fopen.html
% # https://it.mathworks.com/help/matlab/ref/fscanf.html
% # https://it.mathworks.com/help/matlab/ref/fprintf.html
% # https://it.mathworks.com/help/matlab/ref/fclose.html
%