Gestione File
Vitoantonio Bevilacqua vitoantonio.bevilacqua@poliba.it
Antonio Brunetti 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.
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:
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
%