Gestione File: differenze tra le versioni

Da Bioingegneria Elettronica e Informatica.
(Apertura di un file)
 
(77 versioni intermedie di uno stesso utente non sono mostrate )
Riga 3: Riga 3:
 
'''Antonio Brunetti''' [mailto:antonio.brunetti@poliba.it  antonio.brunetti@poliba.it]
 
'''Antonio Brunetti''' [mailto:antonio.brunetti@poliba.it  antonio.brunetti@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.  
+
'''Gianpaolo Francesco Trotta''' [mailto:gianpaolofrancesco.trotta@poliba.it  gianpaolofrancesco.trotta@poliba.it]
  
 
''Parole chiave:'' Input/Output, File di testo, File Binari.
 
''Parole chiave:'' Input/Output, File di testo, File Binari.
 
<pre style="color: red">ATTENZIONE !!! - PAGINA IN ALLESTIMENTO</pre>
 
  
 
== Introduzione ==
 
== Introduzione ==
Riga 17: Riga 15:
 
* flussi binari - una sequenze di byte con corrispondenza uno ad uno con quelli della periferica esterna.
 
* flussi binari - una sequenze di byte con corrispondenza uno ad uno con quelli della periferica esterna.
  
== Apertura di un file ==
+
== 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).
 
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:
 
Per poter utilizzare un file, quindi aprirlo, si utilizza la funzione ''fopen'' la cui sintassi è la seguente:
Riga 23: Riga 21:
 
<code>''fileID'' = fopen(''filename'',''permission'')</code>
 
<code>''fileID'' = fopen(''filename'',''permission'')</code>
 
</div>
 
</div>
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 [https://it.mathworks.com/help/matlab/ref/fopen.html#inputarg_permission fopen]
+
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 [https://it.mathworks.com/help/matlab/ref/fopen.html fopen]; di seguito sono riportate le modalità più comuni di accesso al file.
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! permission
 +
! descrizione
 +
|-
 +
| 'r'
 +
| Apertura del file in modalità lettura.
 +
|-
 +
| 'w'
 +
| Apertura del file in modalità scrittura. <p style="color: red">Se il file non esiste, viene creato; se il già file esiste, il suo contenuto viene perso.</p>
 +
|-
 +
| '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:
 +
<div align="center">
 +
<code>fclose(''fileID'')</code>
 +
</div>
 +
 
 +
== Lettura e scrittura formattata ==
 +
Una volta aperto il file con la funzione [[#Apertura di un file|''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 ===
 +
<div align="center">
 +
<code>fprintf(''fileID'', ''formatSpec'', ''A1'', ..., ''An'')</code>
 +
</div>
 +
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 [https://it.mathworks.com/help/matlab/ref/fprintf.html fprintf] è possibile notare che esistono una moltitudine di operatori di formattazione. Tra i più comuni ci sono i seguenti:
 +
{| class="wikitable" border="1"
 +
|-
 +
! Operatore
 +
! Descrizione
 +
|-
 +
| %d (o %i)
 +
| Intero con segno
 +
|-
 +
| %f
 +
| Numero in virgola mobile
 +
|-
 +
| %c (%s)
 +
| Singolo carattere (Stringhe)
 +
|}
 +
 
 +
=== Lettura da file ===
 +
<div align="center">
 +
<code>''A'' = fscanf(''fileID'', ''formatSpec'', ''sizeA'')</code>
 +
</div>
 +
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 [[#Scrittura su file|sezione precedente]]. Ulteriori dettagli si possono trovare sulla documentazione ufficiale della funzione [https://it.mathworks.com/help/matlab/ref/fscanf.html 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 [[#Apertura e Chiusura di un file | relativa sezione dei file di testo]].
 +
 
 +
Una volta aperto il file con la funzione [[#Apertura di un file|''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 ===
 +
<div align="center">
 +
<code>fwrite(''fileID'', ''A'', ''precision'')</code>
 +
</div>
 +
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 [https://it.mathworks.com/help/matlab/ref/fwrite.html#inputarg_precision documentazione]; di seguito ne sono riportati alcuni:
 +
 
 +
{| class="wikitable" border="1"
 +
|-
 +
! 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 ===
 +
<div align="center">
 +
<code>''A'' = fread(''fileID'', ''sizeA'', ''precision'')</code>
 +
</div>
 +
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 [https://it.mathworks.com/help/matlab/ref/fread.html#inputarg_precision documentazione] e sono analoghi a quelli riportati nella sezione della [[#Scrittura su file | 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. Ulteriori dettagli sono presenti nella relativa pagina della [https://it.mathworks.com/help/matlab/ref/fseek.html documentazione]. In particolare, 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
 +
 
 +
* ''ftell'' -> ''position'' = ftell(''fileID'')  restituisce la posizione corrente nel file indicato da ''fileID''. Se la funzione non va a buon fine, il valore di ''position''sarà -1. La relativa documentazione si trova [https://it.mathworks.com/help/matlab/ref/ftell.html qui]
 +
 
 +
* ''frewind'' -> frewind(''fileID'') riporta l'indicatore di posizione all'inizio del file indicato da ''fileID''. '''OSSERVAZIONE''': una chiamata ''frewind(fileID)'' è equivalente alla chiamata ''fseek(fileID,0'bof')''. La pagina relativa alla documentazione è [https://it.mathworks.com/help/matlab/ref/frewind.html questa]
 +
 
 +
== 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.
 +
<syntaxhighlight lang="matlab" line>
 +
 
 +
%% 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
 +
%
 +
</syntaxhighlight>
 +
 
 +
=== 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.
 +
<syntaxhighlight lang="matlab" line>
 +
 
 +
%% 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
 +
%
 +
</syntaxhighlight>
 +
 
 +
=== 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.
 +
 
 +
<syntaxhighlight lang="matlab" line>
 +
 
 +
%% 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
 +
%
 +
</syntaxhighlight>
 +
 
 +
 
 +
=== 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'.
 +
 
 +
<syntaxhighlight lang="matlab" line>
 +
%% 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
 +
%
 +
</syntaxhighlight>
 +
 
 +
=== 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.
 +
 
 +
<syntaxhighlight lang="matlab" line>
 +
%% 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
 +
%
 +
</syntaxhighlight>
 +
 
 +
=== 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.
 +
 
 +
<syntaxhighlight lang="matlab" line>
 +
%% 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
 +
%
 +
</syntaxhighlight>
 +
 
 +
== Esempi Applicativi: File binari ==
 +
=== 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 binario nominato 'vettore.dat' nella directory corrente.
 +
<syntaxhighlight lang="matlab" line>
 +
 
 +
%% Scrittura file binari
 +
 
 +
% 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.dat','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
 +
    fwrite(fileID, V(i),'double');
 +
end
 +
 
 +
% Chiusura del file
 +
fclose(fileID);
 +
 
 +
%% Riferimenti utili
 +
%
 +
% # https://it.mathworks.com/help/matlab/ref/fopen.html
 +
% # https://it.mathworks.com/help/matlab/ref/fwrite.html
 +
% # https://it.mathworks.com/help/matlab/ref/fclose.html
 +
%
 +
 
 +
</syntaxhighlight>
 +
 
 +
=== Lettura da file ===
 +
Esiste un file di testo, chiamato 'vettore.dat' 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.
 +
<syntaxhighlight lang="matlab" line>
 +
 
 +
%% Lettura file binari
 +
 
 +
% Inizializzazione delle variabili
 +
N = 10;
 +
V = [];
 +
 
 +
% Apertura del file in modalità di lettura
 +
fileID = fopen('vettore.dat', 'r');
 +
for i = 1 : N
 +
    V(i) = fread(fileID, 1,'double');
 +
end
 +
 
 +
% Chiusura del file
 +
fclose(fileID);
 +
 
 +
% Cliclo 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/fread.html
 +
% # https://it.mathworks.com/help/matlab/ref/fclose.html
 +
%
 +
</syntaxhighlight>
 +
 
 +
=== Utilizzo del posizionamento all'interno del file ===
 +
Esiste un file binario, chiamato 'originale.dat' che contiene un certo numero N di elementi interi non noto a priori. Si vuole leggere il file e salvare tutti i suoi elementi in un altro file binario chiamato 'copia.txt' preceduti dal numero degli elementi.
 +
 
 +
<syntaxhighlight lang="matlab" line>
 +
%% Lettura e scrittura di file binari
 +
 
 +
% Apro il file in lettura
 +
fileID = fopen('vettore.dat','r');
 +
 
 +
% Uso la funzione fseek per spostarmi alla fine del file
 +
status = fseek(fileID, 0, 'eof');
 +
 
 +
% Uso la funzione ftell per recuperare il numero di elementi scritti sul file
 +
% NB. In questo caso, trattandosi di numeri interi (32 bit), la divisione per 4 è necessaria per avere il numero effettivo di elementi
 +
N = ftell(fileID)/8;
 +
 
 +
% Inizializzo il vettore
 +
V = [];
 +
 
 +
% Uso la funzione fseek per spostarmi all'inizio del file
 +
status = fseek(fileID, 0, 'bof');
 +
 
 +
% Leggo gli elementi da file e gli inserisco nel vettore v
 +
for i = 1 : N
 +
    V(i) = fread(fileID, 1, 'double');
 +
end
 +
 
 +
% Chiudo il file
 +
fclose(fileID);
 +
 
 +
% Apro il file copia.txt in modalità scrittura
 +
fileID = fopen('copia.txt','w');
 +
 
 +
% Scrivo sul file il numero N
 +
fprintf(fileID, '%d ', N);
 +
 
 +
% Scrivo sul file gli elementi del vettore
 +
for i = 1 : N
 +
    fprintf(fileID, '%d ', V(i));
 +
end
 +
 
 +
% Chiudo il file
 +
fclose(fileID);
 +
 
 +
%% Riferimenti utili
 +
%
 +
% # https://it.mathworks.com/help/matlab/ref/fopen.html
 +
% # https://it.mathworks.com/help/matlab/ref/fclose.html
 +
% # https://it.mathworks.com/help/matlab/ref/fseek.html
 +
% # https://it.mathworks.com/help/matlab/ref/ftell.html
 +
% # https://it.mathworks.com/help/matlab/ref/fread.html
 +
%
 +
</syntaxhighlight>

Versione attuale delle 19:52, 14 gen 2017

Vitoantonio Bevilacqua vitoantonio.bevilacqua@poliba.it

Antonio Brunetti antonio.brunetti@poliba.it

Gianpaolo Francesco Trotta gianpaolofrancesco.trotta@poliba.it

Parole chiave: Input/Output, File di testo, File Binari.

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. Ulteriori dettagli sono presenti nella relativa pagina della documentazione. In particolare, 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
  • ftell -> position = ftell(fileID) restituisce la posizione corrente nel file indicato da fileID. Se la funzione non va a buon fine, il valore di positionsarà -1. La relativa documentazione si trova qui
  • frewind -> frewind(fileID) riporta l'indicatore di posizione all'inizio del file indicato da fileID. OSSERVAZIONE: una chiamata frewind(fileID) è equivalente alla chiamata fseek(fileID,0'bof'). La pagina relativa alla documentazione è questa

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.

  1. %% Scrittura file di testo
  2.  
  3. % Inizializzazione delle variabili
  4. N = 10;
  5. v = [];
  6.  
  7. % Acquisizione da tastiera degli elementi del vettore
  8. for i = 1 : N
  9.     v(i) = input('');
  10. end
  11.  
  12. % Apertura file in modalità scrittura
  13. fileID = fopen('vettore.txt','w');
  14. % In questo momento, se il file non esiste, viene creato
  15.  
  16. % Ciclo per la scrittura di tutti gli elementi sul file
  17. for i = 1 : N
  18.     fprintf(fileID, '%d ', v(i));
  19. end
  20. % NB: prestare attenzione allo spazio in '%d '... è necessario affinché i numeri vengano stampati separati all'interno del file 
  21.  
  22. % Chiusura del file
  23. fclose(fileID);
  24.  
  25. %% Riferimenti utili
  26. %
  27. % # https://it.mathworks.com/help/matlab/ref/fopen.html
  28. % # https://it.mathworks.com/help/matlab/ref/fprintf.html
  29. % # https://it.mathworks.com/help/matlab/ref/fclose.html
  30. %

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.

  1. %% Lettura file di testo
  2.  
  3. % Inizializzazione delle variabili
  4. N = 10;
  5. V = [];
  6.  
  7. % Apertura del file in modalità lettura
  8. fileID = fopen('vettore.txt','r');
  9. for i = 1 : N
  10.     V(i) = fscanf(fileID, '%d', 1);
  11. end
  12.  
  13. % Chiusura del file
  14. fclose(fileID);
  15.  
  16. % Ciclo per la stampa a video degli elementi del vettore V
  17. for i = 1 : N
  18.     disp(V(i));
  19. end
  20.  
  21.  
  22. %% Riferimenti utili
  23. %
  24. % # https://it.mathworks.com/help/matlab/ref/fopen.html
  25. % # https://it.mathworks.com/help/matlab/ref/fscanf.html
  26. % # https://it.mathworks.com/help/matlab/ref/fclose.html
  27. %

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.

  1. %% Scrittura e lettura da file di testo
  2.  
  3. % Inizializzazione variabili
  4. N = 10;
  5. V = [];
  6.  
  7. % Acquisizione da tastiera delle componenti del vettore
  8. for i = 1 : N
  9.     V(i) = input('');
  10. end
  11.  
  12. % Apertura file in modalità scrittura
  13. fileID = fopen('vettore.txt','w');
  14.  
  15. % Scrittura su file degli elementi del vettore V
  16. for i = 1 : N
  17.     fprintf(fileID, '%d ', V(i));
  18. end
  19. % NB: prestare attenzione allo spazio in '%d '... è necessario affinché i numeri vengano stampati separati all'interno del file 
  20.  
  21. % Chiusura del file
  22. fclose(fileID);
  23.  
  24. % Inizializzazione del vettore oggi
  25. oggi = [];
  26.  
  27. % Apertura del file in modalità lettura
  28. fileID = fopen('vettore.txt','r');
  29.  
  30. % Lettura da file degli elementi del vettore
  31. for i = 1 : N
  32.     oggi(i) = fscanf(fileID, '%d', 1);
  33. end
  34.  
  35. % Chiusura del file
  36. fclose(fileID);
  37.  
  38. % Stampa a video degli elementi del vettore
  39. for i = 1 : N
  40.     disp(oggi(i));
  41. end
  42.  
  43. %% Riferimenti utili
  44. %
  45. % # https://it.mathworks.com/help/matlab/ref/fopen.html
  46. % # https://it.mathworks.com/help/matlab/ref/fscanf.html
  47. % # https://it.mathworks.com/help/matlab/ref/fclose.html
  48. %


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'.

  1. %% Copia del contenuto di un file di testo in un altro file di testo
  2.  
  3. % Inizializzazione delle variabili
  4. V = [];
  5. N = 10;
  6.  
  7. % Apertura del file originale in modalità lettura
  8. fileID = fopen('originale.txt','r');
  9.  
  10. % Ciclo per la lettura da file degli elementi del vettore
  11. for i = 1 : N
  12.     V(i) = fscanf(fileID, '%d ', 1);
  13. end
  14.  
  15. % Chiusura del file
  16. fclose(fileID);
  17.  
  18. % Apertura del file copia in modalità scrittura
  19. fileID = fopen('copia.txt','w');
  20.  
  21. % Ciclo per la stampa su file degli elementi del vettore V
  22. for i = 1 : N
  23.      fprintf(fileID, '%d ', V(i));
  24. end
  25.  
  26. % Chiusura del file
  27. fclose(fileID);
  28.  
  29. %% Riferimenti utili
  30. %
  31. % # https://it.mathworks.com/help/matlab/ref/fopen.html
  32. % # https://it.mathworks.com/help/matlab/ref/fscanf.html
  33. % # https://it.mathworks.com/help/matlab/ref/fprintf.html
  34. % # https://it.mathworks.com/help/matlab/ref/fclose.html
  35. %

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.

  1. %% Calcolo del doppio delle componenti di un vettore
  2.  
  3. % Inizializzazione delle variabili
  4. V = [];
  5. N = 10;
  6.  
  7. % Apertura dei file
  8. fileIngresso = fopen('originale.txt','r');
  9. fileUscita = fopen('doppio.txt','w');
  10.  
  11. % ATTENZIONE: è possibile gestire lettura, elaborazione e scrittura
  12. % utilizzando un unico ciclo for
  13. for i = 1 : N
  14.     V(i) = fscanf(fileIngresso, '%d ', 1);
  15.     V(i) = V(i) * 2;
  16.     fprintf(fileUscita, '%d ', V(i));
  17. end
  18.  
  19. % Chiusura dei file
  20. fclose(fileIngresso);
  21. fclose(fileUscita);
  22.  
  23. %% Riferimenti utili
  24. %
  25. % # https://it.mathworks.com/help/matlab/ref/fopen.html
  26. % # https://it.mathworks.com/help/matlab/ref/fscanf.html
  27. % # https://it.mathworks.com/help/matlab/ref/fprintf.html
  28. % # https://it.mathworks.com/help/matlab/ref/fclose.html
  29. %

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.

  1. %% Calcolo della media delle componenti di un vettore
  2.  
  3. % Inizializzazione delle variabili
  4. N = 10;
  5. somma = 0;
  6. V = [];
  7.  
  8. % Apertura dei file
  9. fileIngresso = fopen('originale.txt','r');
  10. fileUscita = fopen('media.txt','w');
  11.  
  12. % Acquisizione degli elementi dal file
  13. for i = 1 : N
  14.     V(i) = fscanf(fileIngresso, '%d ', 1);
  15.     somma = somma + V(i);
  16. end
  17.  
  18. % Calcolo della media
  19. media = somma / N;
  20.  
  21. % La media è un numero in virgola mobile, quindi si utilizza il %f (.2
  22. % serve a specificare il numero di cifre dopo la virgola).
  23. fprintf(fileUscita, '%.2f ', media);
  24.  
  25. % Chiusura dei file
  26. fclose(fileIngresso);
  27. fclose(fileUscita);
  28.  
  29. %% Riferimenti utili
  30. %
  31. % # https://it.mathworks.com/help/matlab/ref/fopen.html
  32. % # https://it.mathworks.com/help/matlab/ref/fscanf.html
  33. % # https://it.mathworks.com/help/matlab/ref/fprintf.html
  34. % # https://it.mathworks.com/help/matlab/ref/fclose.html
  35. %

Esempi Applicativi: File binari

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 binario nominato 'vettore.dat' nella directory corrente.

  1. %% Scrittura file binari
  2.  
  3. % Inizializzazione delle variabili
  4. N = 10;
  5. V = [];
  6.  
  7. % Acquisizione da tastiera degli elementi del vettore
  8. for i = 1 : N
  9.     V(i) = input('');
  10. end
  11.  
  12. % Apertura file in modalità scrittura
  13. fileID = fopen('vettore.dat','w');
  14. % In questo momento se il file non esiste viene creato
  15.  
  16. % Ciclo per la scrittura di tutti gli elementi sul file
  17. for i = 1 : N
  18.     fwrite(fileID, V(i),'double');
  19. end
  20.  
  21. % Chiusura del file
  22. fclose(fileID);
  23.  
  24. %% Riferimenti utili
  25. %
  26. % # https://it.mathworks.com/help/matlab/ref/fopen.html
  27. % # https://it.mathworks.com/help/matlab/ref/fwrite.html
  28. % # https://it.mathworks.com/help/matlab/ref/fclose.html
  29. %

Lettura da file

Esiste un file di testo, chiamato 'vettore.dat' 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.

  1. %% Lettura file binari
  2.  
  3. % Inizializzazione delle variabili
  4. N = 10;
  5. V = [];
  6.  
  7. % Apertura del file in modalità di lettura
  8. fileID = fopen('vettore.dat', 'r');
  9. for i = 1 : N
  10.     V(i) = fread(fileID, 1,'double');
  11. end
  12.  
  13. % Chiusura del file
  14. fclose(fileID);
  15.  
  16. % Cliclo per la stampa a video degli elementi del vettore V
  17. for i = 1 : N
  18.     disp(V(i));
  19. end
  20.  
  21. %% Riferimenti utili
  22. %
  23. % # https://it.mathworks.com/help/matlab/ref/fopen.html
  24. % # https://it.mathworks.com/help/matlab/ref/fread.html
  25. % # https://it.mathworks.com/help/matlab/ref/fclose.html
  26. %

Utilizzo del posizionamento all'interno del file

Esiste un file binario, chiamato 'originale.dat' che contiene un certo numero N di elementi interi non noto a priori. Si vuole leggere il file e salvare tutti i suoi elementi in un altro file binario chiamato 'copia.txt' preceduti dal numero degli elementi.

  1. %% Lettura e scrittura di file binari
  2.  
  3. % Apro il file in lettura
  4. fileID = fopen('vettore.dat','r');
  5.  
  6. % Uso la funzione fseek per spostarmi alla fine del file
  7. status = fseek(fileID, 0, 'eof');
  8.  
  9. % Uso la funzione ftell per recuperare il numero di elementi scritti sul file
  10. % NB. In questo caso, trattandosi di numeri interi (32 bit), la divisione per 4 è necessaria per avere il numero effettivo di elementi
  11. N = ftell(fileID)/8;
  12.  
  13. % Inizializzo il vettore
  14. V = [];
  15.  
  16. % Uso la funzione fseek per spostarmi all'inizio del file
  17. status = fseek(fileID, 0, 'bof');
  18.  
  19. % Leggo gli elementi da file e gli inserisco nel vettore v
  20. for i = 1 : N
  21.     V(i) = fread(fileID, 1, 'double');
  22. end
  23.  
  24. % Chiudo il file
  25. fclose(fileID);
  26.  
  27. % Apro il file copia.txt in modalità scrittura
  28. fileID = fopen('copia.txt','w');
  29.  
  30. % Scrivo sul file il numero N
  31. fprintf(fileID, '%d ', N);
  32.  
  33. % Scrivo sul file gli elementi del vettore
  34. for i = 1 : N
  35.      fprintf(fileID, '%d ', V(i));
  36. end
  37.  
  38. % Chiudo il file
  39. fclose(fileID);
  40.  
  41. %% Riferimenti utili
  42. %
  43. % # https://it.mathworks.com/help/matlab/ref/fopen.html
  44. % # https://it.mathworks.com/help/matlab/ref/fclose.html
  45. % # https://it.mathworks.com/help/matlab/ref/fseek.html
  46. % # https://it.mathworks.com/help/matlab/ref/ftell.html
  47. % # https://it.mathworks.com/help/matlab/ref/fread.html
  48. %