Corso di Visual Basic
Questo mese il corso
dedicato alla programmazione in Visual Basic ha come obbiettivo la gestione dei file di
testo, ovvero del più semplice formato di memorizzazione permanente previsto dallo
strumento Microsoft
Corso di Visual Basic
- parte X
di Maurizio Crespi
La maggior parte delle applicazioni deve
essere in grado di memorizzare delle informazioni su un supporto di memoria di massa,
costituito in genere da un'unità a disco, in modo tale da renderle reperibili nelle
sessioni successive. La struttura destinata ad accogliere questi dati, oggetto di studio
in questa lezione, prende il nome di file.
Le soluzioni degli esercizi proposti
nella scorsa lezione
Prima di avventurarsi nello studio dei file, è bene focalizzare come di consueto
l'attenzione sugli esercizi proposti nello scorso numero. Eccone, in breve, le soluzioni.
Primo esercizio
Il primo esercizio prevede lo sviluppo di una funzione booleana in grado di ricevere come
parametro una stringa alfanumerica e di restituire True se essa contiene il nome di
un giorno della settimana. In caso contrario, il valore ritornato deve essere False.
La soluzione, pressoché banale, è la seguente:
Function Giorno(Stringa As String) As
Boolean
Dim Risultato As Boolean
Select Case UCase(Stringa)
Case "LUNEDI", "MARTEDI", "MERCOLEDI", "GIOVEDI",
"VENERDI", "SABATO", "DOMENICA"
Risultato = True
Case Else
Risultato = False
End Select
Giorno = Risultato
End Function
Il valore restituito corrisponde a quello
della variabile Risultato, che è aggiornato da una semplice struttura Select
Case effettuata sulla stringa convertita in maiuscolo.
Secondo esercizio
Il secondo esercizio prevede la realizzazione di una funzione ricorsiva che, dato un
parametro n intero positivo passato per valore, sia in grado di restituire la somma
dei primi n numeri naturali. La soluzione è rappresentata dalla funzione Calcola
descritta di seguito.
Function Calcola(n As Integer)As Long
Dim Somma As Long
If n > 0 Then
Somma = n + Calcola(n - 1)
End If
Calcola = Somma
End Function
Se il parametro n ha un valore non
nullo, è sommato al risultato dell'applicazione della funzione a n-1. Se invece n
è uguale a zero, si verifica la condizione di uscita.
I file
Un file è un agglomerato di informazioni residente su un supporto di memorizzazione di
massa, ovvero su un dispositivo caratterizzato dalla capacità di mantenere i dati anche
dopo lo spegnimento e il successivo riavvio del sistema. Di solito si tratta di un'unità
a disco fisso o rimovibile. Le informazioni contenute in un file non devono essere
necessariamente di tipo omogeneo. Esiste infatti la possibilità di creare dei file
strutturati, in grado cioè di contenere elementi di pari caratteristiche, oppure composti
da informazioni di natura anche profondamente diversa. Visual Basic permette di creare 3
diversi tipi di file, con accesso sequenziale o casuale. In questa lezione sono oggetto di
studio le strutture ad accesso sequenziale.
I file ad accesso sequenziale
Le strutture più elementari sono i file ad accesso sequenziale, il cui uso è in genere
riservato alla memorizzazione delle informazioni testuali. Si tratta di strutture
organizzate in righe, da utilizzare quando si desidera salvare dei documenti da stampare
oppure per la memorizzazione di limitate quantità di dati (come ad esempio quelle
riguardanti le impostazioni di un programma). Il vantaggio offerto dai file ad accesso
sequenziale è rappresentato dalla semplicità con cui è possibile accedere al loro
contenuto mediante un qualsiasi editor di testo, come il Blocco Note di Windows.
Sono di questo tipo, ad esempio, i file Win.ini e System.ini, contenenti le
informazioni riguardanti la configurazione dell'ambiente Windows a 16 bit.
L'organizzazione dei dati, tuttavia, fa sì che le strutture di questo tipo non siano
adatte a contenere una grande quantità di informazioni, a causa del dilatarsi dei tempi
di accesso dovuto al fatto che la ricerca di un particolare dato può comportare la
lettura dell'intero file.
L'apertura di un file sequenziale
Un file, di qualsiasi tipo esso sia, per poter essere utilizzato deve necessariamente
essere aperto. È possibile effettuare ciò per mezzo del comando Open, la cui
sintassi, per le strutture ad accesso sequenziale, è la seguente:
Open <percorso_file>
[For <modalità>]
As [#]<numero_identificatore>
[Len=<lunghezza_record>]
dove <percorso_file> è una
stringa che identifica il percorso del file che si desidera creare o leggere. Se si sta
usando una versione a 32 bit dello strumento e quindi si sta realizzando un'applicazione
funzionante solo su Windows 95, 98 o NT, è possibile far uso dei nomi di file lunghi.
Ciò non è consentito invece alle applicazioni destinate ad essere compilate con una
versione a 16 bit di Visual Basic. In questo caso, occorre adeguarsi al formato previsto
da MS-DOS e dalla macchina virtuale a 16 bit di Windows, che prevede un massimo di 8
caratteri per i nomi dei file e di 3 per le estensioni. Il carattere separatore è in
tutti i casi costituito dalla barra retroversa "\".Dopo aver specificato il nome
del file da gestire, è necessario indicare la modalità con cui si desidera accedere ad
esso. La scelta è fra Input, Output e Append. Nel primo caso, il
file è aperto in lettura, ovvero è utilizzato esclusivamente per reperire delle
informazioni senza effettuare su di esse alcuna modifica. È evidente che l'apertura di un
file in questa modalità richiede che esso sia stato in precedenza creato sul disco,
altrimenti provoca la notifica di un errore.Diversamente accade invece per i file aperti
in output. In questo caso, infatti, si provoca la generazione di una nuova struttura e la
sovrascrittura del file eventualmente già presente sul disco con il nome specificato dopo
la parola chiave Open. Com'è facile intuire, l'accesso in output ha il fine di
permettere la scrittura delle informazioni sui file. In alcuni casi, tuttavia, risulta
necessario inserire all'interno di uno di essi dei nuovi dati senza distruggere quelli
inseriti in una o più sessioni precedenti. La modalità da utilizzare per raggiungere
tale scopo è denominata Append.
Il numero identificatore
Dopo aver dichiarato l'uso che si desidera fare del file, è necessario assegnare ad esso
un numero, che ne costituisce un identificatore univoco. Tale valore deve essere un intero
compreso fra 1 e 511 e va specificato dopo la parola chiave As. Per le strutture
non destinate alla condivisione con altre applicazioni, è opportuno utilizzare i numeri
compresi fra 1 e 255, riservando i rimanenti ai file che devono essere resi accessibili da
più processi nello stesso momento. Si noti che, per compatibilità con il linguaggio
BASIC classico, il numero di identificazione si può far precedere dal carattere #.
Il parametro Len
L'ultimo parametro che resta da esaminare è quello che definisce la lunghezza di ogni
blocco di informazioni interessato dalle operazioni di lettura o scrittura. Esso è
opzionale e rappresenta la dimensione dello spazio di memoria temporanea (denominato buffer)
allocato dal sistema. Tale valore non può essere superiore a 32767.
L'istruzione Close
Se il comando Open rende possibile accedere a un file e crea per esso un
identificatore, l'effetto contrario, ovvero il rilascio della struttura e l'eliminazione
del numero di riferimento, è sortito dall'istruzione Close. Si supponga di aver
aperto un file e di aver assegnato ad esso l'identificatore 1. La riga
Close #1
determina la fine dell'uso della struttura
da parte del programma, pur rendendone possibile la successiva riapertura. Il numero di
riferimento ritorna così ad essere utilizzabile per la gestione di un altro file.
La lettura di un file di testo
Si supponga di voler realizzare un'applicazione in grado di visualizzare in una casella di
testo il contenuto del file di sistema Win.ini. In primo luogo, è necessario
disegnare un form analogo a quello rappresentato nella figura 1, in cui è presente
una textbox, che si suppone denominata txtTesto. È poi necessario fare in modo che
all'avvio del programma essa sia riempita con il testo contenuto nel file da leggere. A
tal fine, si può associare il seguente codice all'evento Load del form:
Private Sub Form_Load()
Dim Riga As String
txtTesto.Text = ""
Open "c:\windows\win.ini" For Input As #1
Do Until EOF(1)
Line Input #1, Riga
txtTesto.Text = txtTesto.Text & Riga & Chr$(13) & Chr$(10)
Loop
Close #1
End Sub
Dopo aver eliminato i caratteri
eventualmente presenti nella textbox, la procedura provvede ad aprire in input il file,
che si suppone contenuto nella cartella "C:\Windows" e ad associargli il numero
identificatore 1. Tutte le operazioni che in seguito sono effettuate sul file sono
prodotte da istruzioni riceventi tale valore come parametro.Il file da leggere è
notoriamente composto da testo organizzato in righe. Lo scopo dell'applicazione illustrata
in questo esempio è di leggere tutte le righe e di copiarle, una di seguito all'altra,
nella textbox. A tal fine è necessario creare un ciclo in grado di svolgere le operazioni
di lettura. La condizione che deve causare il termine delle iterazioni è rappresentata
dal raggiungimento della fine del file. Ciò si verifica quando tutti i dati sono stati
letti. Il file, tuttavia, potrebbe anche essere vuoto. È pertanto necessario fare in modo
che il ciclo preveda il test all'ingresso, ovvero che la condizione sia specificata
accanto alla parola chiave Do, al fine di evitare le iterazioni quando essa risulti
vera già immediatamente dopo l'esecuzione del comando Open.
La funzione EOF
Un file sequenziale può essere paragonato a un nastro magnetico. Per sapere se
l'ipotetica testina di lettura ha raggiunto la posizione di fine, è necessario ricorrere
alla funzione EOF (End Of File), alla quale, come di consueto, va passato
come parametro il numero identificatore della struttura a cui si desidera far riferimento.
Il valore restituito è di tipo logico e vale True se è raggiunta la fine del
file; ovviamente, in caso contrario, il risultato è False.
La funzione Line Input
La lettura di una riga di un file di testo è effettuata per mezzo dell'istruzione Line
Input. Essa prevede due parametri; il primo è costituito ancora una volta
dall'identificatore del file su cui è eseguita l'operazione. Il secondo, invece, è
rappresentato dalla variabile di tipo stringa destinata ad ospitare la riga di testo da
leggere. Nell'esempio è stata utilizzata la variabile denominata Riga. In esso, il
dato letto è aggiunto al contenuto della casella testuale per mezzo dell'operatore di
concatenazione di stringhe (&). Si noti che per passare alla riga successiva
della textbox si fa uso di una sequenza composta dal carattere di ritorno del carrello (Chr$(13))
e da quello di avanzamento di una riga (Chr$(10)).
La scrittura su un file di testo
Si supponga ora di voler realizzare un programma in grado di effettuare l'esatto contrario
del precedente, ovvero di trasferire su un file di testo il contenuto di una textbox. La
sua implementazione risulta estremamente semplice. In pratica richiede esclusivamente
l'uso di un'istruzione Print.Si consideri il form rappresentato in figura 2,
caratterizzato dalla presenza di 3 pulsanti. Il primo è denominato btnCarica ed ha
lo scopo di caricare nella textbox txtTesto il contenuto del file di cui è
specificato il nome nella casella txtNomeFile. Un secondo pulsante, denominato btnCancella,
ha lo scopo di eliminare il contenuto della textbox, mentre il terzo serve per memorizzare
in un file le informazioni presenti all'interno del controllo txtTesto. Il codice
è riportato nel listato 1. Si noti che la procedura che si occupa del caricamento
dei dati è pressoché identica a quella dell'esempio precedente; si differenzia solo
perché il nome del file da leggere è acquisito dal controllo txtNomeFile,
anziché essere fisso. Il salvataggio del file sul disco è eseguito in modo estremamente
semplice; in pratica il programma non deve far altro che aprire il la struttura in output
ed eseguire su di essa l'istruzione Print, la quale riceve come parametri,
rispettivamente, il numero identificatore e la stringa da scrivere, nella fattispecie
costituita dal contenuto del controllo txtTesto.
Un semplice esercizio
Per esercitarsi sugli argomenti esposti, si provi a realizzare un'applicazione in grado di
leggere, per mezzo di opportune textbox, tre valori numerici interi e una stringa. Si
preveda poi la possibilità di salvarli in un file in seguito alla pressione di un
pulsante. Mediante un altro bottone, si faccia in modo che l'utente possa ripristinare
all'interno delle caselle di testo i valori salvati sul disco.
Nella prossima lezione
I file di testo sono solo un tipo di struttura di memorizzazione permanente su
supporti di memoria di massa. Visual Basic permette di gestire anche dei file strutturati
in modo diverso, adatti per esigenze differenti e per realizzazioni più impegnative,
quali ad esempio quelle che accedono a una grande quantità di informazioni in modo non
conforme a uno schema rigidamente sequenziale come quello descritto nei paragrafi
precedenti. Per sapere com'è possibile fare ciò, occorre semplicemente attendere la
prossima lezione.
Bibliografia
Visual Basic 5- McGrawHill ISBN 88-386-0436-3
|