Gestione File: differenze tra le versioni
(→Apertura di un file) |
|||
(48 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] | ||
− | ''' | + | '''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. | ||
− | |||
− | |||
== Introduzione == | == Introduzione == | ||
Riga 84: | Riga 82: | ||
</div> | </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]. | 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 == | == Esempi Applicativi: File di testo == | ||
=== Scrittura su file === | === 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> | <syntaxhighlight lang="matlab" line> | ||
Riga 101: | Riga 161: | ||
end | end | ||
− | % Apertura file | + | % Apertura file in modalità scrittura |
fileID = fopen('vettore.txt','w'); | fileID = fopen('vettore.txt','w'); | ||
% In questo momento, se il file non esiste, viene creato | % In questo momento, se il file non esiste, viene creato | ||
Riga 109: | Riga 169: | ||
fprintf(fileID, '%d ', v(i)); | fprintf(fileID, '%d ', v(i)); | ||
end | end | ||
+ | % NB: prestare attenzione allo spazio in '%d '... è necessario affinché i numeri vengano stampati separati all'interno del file | ||
% Chiusura del file | % Chiusura del file | ||
fclose(fileID); | 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 | ||
Riga 117: | Riga 210: | ||
% | % | ||
% # https://it.mathworks.com/help/matlab/ref/fopen.html | % # 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/fprintf.html | ||
% # https://it.mathworks.com/help/matlab/ref/fclose.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> | </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.
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. 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.
%% 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
%
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.
%% 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
%
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.
%% 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
%
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.
%% 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
%