300 likes | 429 Views
File di dati. Bianchi. Anna. Roma. 1980. Verdi. Luca. Milano. 1960. Neri. 1976. Andrea. Torino. Verdi. Paola. Bari. 1954. File di dati. Definizione. Insieme di record omogenei memorizzati in memoria di massa. Record.
E N D
Bianchi Anna Roma 1980 Verdi Luca Milano 1960 Neri 1976 Andrea Torino Verdi Paola Bari 1954 File di dati Definizione Insieme di record omogenei memorizzati in memoria di massa Record
Per utilizzare i dati presenti in un file sono necessarie le seguenti operazioni Operazioni sui file per rendere disponibile il file per l’elaborazione: stabilisce un collegamento tra la memoria centrale ed il file registrato sulle memorie di massa, riservando un buffer per l’operazione di I/O • apertura • lettura/scrittura • chiusura operazioni che si devono effettuare sul file per rilasciare il file: viene interrotto il collegamento tra memoria centrale ed il file, liberando la memoria riservata per le operazioni di I/O
Bianchi Anna Roma 1980 Verdi Luca Milano 1960 Neri 1976 Andrea Torino Lettura di un file lettura trasferisce un record da M.M. a M.C. Buffer in Memoria centrale Memoria di massa
Bianchi Anna Roma 1980 Verdi Luca Milano 1960 Neri 1976 Andrea Torino Verdi Paola Bari 1954 Scrittura di un file scrittura trasferisce un record da M.C. a M.M. Buffer in Memoria centrale Memoria di massa
File sequenziali Tipologie di file in V.B. • i dati vengono memorizzati in modo sequenziale uno di seguito all’altro • in fase di lettura i record devono essere letti in modo sequenziale (partendo dal primo) • usati per archivi di piccole dimensioni • su disco i campi di tipo String sono racchiusi tra doppi apici • su disco i campi sono separati dalla virgola File ad accesso casuale • i dati vengono memorizzati nella posizione richiesta all’interno del file • in fase di lettura e’ possibile accedere direttamente ad un dato record, conoscendone la posizione nel file
Open percorso For modalita’ As #Numero File sequenziali: apertura • percorso indica il nome fisico del file in memoria di massa, eventualmente corredato dal percorso • modalita’ indica la modalita’ di accesso al file, sulla base dell’operazione che si deve effettuare; puo’ essere: • Outputse si deve creare il file • Append se si devono aggiungere record ad un file esistente • Input se si deve leggere il file • #Numero e’ un numero, stabilito in genere dal programmatore, che identifica il file all’interno dell’applicazione Esempio : Open “Clienti.dat” For Input As #1
Osservazioni sulle modalità di apertura File sequenziali: apertura • Output se il file non esiste viene creato, altrimenti scrive i nuovi dati all’inizio del file sovrascrivendo quelli esistenti (il contenuto precedente viene perso) • Append se il file non esiste viene creato, altrimenti scrive i nuovi dati in coda, senza cancellare quelli esistenti • Input se il file non esiste viene generato un errore di run-time (in VB Err.Number=53)
File sequenziali: chiusura Close #Numero • #Numero e’ il numero del file che si desidera chiudere Esempio : Close #1
File sequenziali: scrittura Write #Numero, dato1, dato2, ....... • #Numero e’ il numero del file in cui si desidera scrivere • datox sono i campi del record che si desidera inserire • Esempi • Write #1, RecClienti.Cognome, RecClienti.Nome, RecClienti.Luogo, RecClienti.AnnoNascita • Write #1, txtCognome, txtNome, txtLuogo, txtAnnoNascita • Osservazioni • Dopo aver scritto l’ultimo carattere, l’istruzione Write inserisce nel file un carattere di nuova riga (ritorno a capo) • Per poter scrivere su un file, il file stesso deve essere stato aperto con modalita’ Output o Append
File sequenziali: lettura Input #Numero, dato1, dato2, ....... • #Numero e’ il numero del file che si desidera leggere • datox sono i campi del record che si desiderano leggere • Esempi • Input #1, RecClienti.Cognome, RecClienti.Nome, RecClienti.Luogo, RecClienti.AnnoNascita • Input #1, lblCognome, lblNome, lblLuogo, lblAnnoNascita • Osservazioni • Per poter legger un file, il file stesso deve essere stato aperto con modalita’ Input
Bianchi Anna Roma 1980 Verdi Luca Milano 1960 Neri 1976 Andrea Torino Verdi Paola Bari 1954 • SE non esiste FileA ALLORA • Segnalazione all’utente • ALTRIMENTI • Trovato=False • Apertura in lettura FileA • ESEGUI MENTRE Not(Fine FileA) • Lettura di un record di FileA • SE condizione da analizzare sul record letto ALLORA • Elaborazioni da effettuare (es.: aggiornamento contatori, visualizzazioni, stampe, ecc…) • Trovato=True • FINE-SE • FINE-ESEGUI • Chiusura FileA • SE Trovato=False ALLORA • La ricerca ha dato esito negativo • [ALTRIMENTI • Eventuali visualizzazioni/stampe di dati finali] • FINE-SE • FINE-SE File sequenziali: ricerca completa 1 1 RecClienti 2 Elaborazioni sui dati …… 2 …… fino alla fine del FileA
Codifica VB File sequenziali: ricerca completa Ipotizziamo di dover contare il numero di clienti nati a Milano • Dim Trovato As Boolean • Dim Tot As Integer • If Dir(“Clienti.dat”)=“” Then • MsgBox “Non esiste l’archivio clienti!” • Else • Trovato=False • Tot=0 • Open “Clienti.dat” For Input As #1 • Do While Not EOF(1) • Input #1, RecClienti.Cognome, RecClienti.Nome, RecClienti.Luogo, RecClienti.AnnoNascita • If (RecClienti.Luogo=“Milano”) Then • Tot=Tot+1 • Trovato=True • End If • Loop • Close #1 • If Not Trovato Then • MsgBox “Nessun cliente è nato a Milano” • Else • MsgBox “Numeo clienti nati a Milano = “ & Tot • End If
Bianchi Anna Roma 1980 Verdi Luca Milano 1960 Neri 1976 Andrea Torino Verdi Paola Bari 1954 File sequenziali: ricerca sequenziale • SE non esiste FileA ALLORA • Segnalazione all’utente • ALTRIMENTI • Trovato=False • Apertura in lettura FileA • ESEGUI MENTRE Not(Fine FileA) E Trovato=False • Lettura di un record di FileA • SE condizione da analizzare sul record letto ALLORA • Elaborazioni da effettuare • Trovato=True • FINE-SE • FINE-ESEGUI • Chiusura FileA • SE Trovato=False ALLORA • La ricerca ha dato esito negativo • FINE-SE • FINE-SE 1 1 RecClienti 2 Elaborazioni sui dati …… 2 …… fino a quando si arriva alla fine del FileA o si trova il record
Codifica VB Ipotizziamo di visualizzare in una etichetta di un form nome e cognome della prima persona (presente nel file) nata nel 1960 File sequenziali: ricerca sequenziale • Dim Trovato As Boolean • If Dir(“Clienti.dat”)=“” Then • MsgBox “Non esiste l’archivio clienti!” • Else • Trovato=False • Open “Clienti.dat” For Input As #1 • Do While Not EOF(1) And Trovato=False • Input #1, RecClienti.Cognome, RecClienti.Nome, RecClienti.Luogo, RecClienti.AnnoNascita • If (RecClienti.AnnoNascita=1960) Then • lblCognome=RecClienti.Cognome • lblNome=RecClienti.Nome • Trovato=True • End If • Loop • Close #1 • If Not Trovato Then • MsgBox “Nessun cliente è nato a Milano” • End If
Bianchi Anna Roma 1980 Verdi Luca Milano 1960 Neri 1976 Andrea Torino Verdi Paola Bari 1954 Non è possibile ordinare i dati direttamente nel file I dati verranno caricati in una tabella in M.C. e ordinati File sequenziali: ordinamento di dati • CARICAMENTO TABELLA • Apertura in lettura FileA • I=0 • ESEGUI MENTRE Not(Fine FileA) • I=I+1 • Lettura di un record di FileA in Tabxxx(I) • FINE-ESEGUI • Chiusura FileA • N=I • Cancellazione FileA • Rinominare FileB con nome FileA • ORDINAMENTO TABELLA • PER I=1 To N-1 • PER J=I+1 TO N • Confronto e scambio dati • NEXT J • NEXT I • STAMPA/VISUALIZZAZIONE DATI ORDINATI 1 1 TabClienti 2 …… fino alla fine del FileA 3
Codifica VB Stampa elenco clienti ordinato in base all’anno di nascita File sequenziali: ordinamento If Dir(“Clienti.dat”)=“” Then MsgBox “Non esiste l’archivio clienti!” Else I=0 Open “Clienti.dat” For Input As #1 Do While Not EOF(1) I=I+1 Input #1, TabClienti(I).Cognome, TabClienti(I).Nome, ….. Loop Close #1 N=I For I=1 To N-1 For J=I+1 To N If TabClienti(I).Anno > TabClienti(J).Anno Then RecTemp=TabClienti(I) TabClienti(I)=TabClienti(J) TabClienti(J)=RecTemp End If Next J Next I For I=1 To N Printer.Print Tab(5);TabClienti(I).Cognome; ……. Next I • Si dovranno dichiarare: • La tabella • RecTemp • Le variabil I,J,N
File sequenziali: modifica dei dati • Non è possibile effettuare direttamente modifiche (aggiornamenti o cancellazioni) sui record presenti in un file sequenziale • Per effettuare aggiornamenti o cancellazioni di record occorre utilizzare un secondo file nel quale: • registrare tutti i record con le eventuali modifiche (in caso di aggiornamento) • registrare i record da conservare, tralasciando quelli da cancellare (in caso di cancellazione)
Bianchi Anna Roma 1980 Verdi Luca Milano 1960 Neri 1976 Andrea Torino Verdi Paola Bari 1954 Aggiornamento di dati File sequenziali: modifica dei dati 1 • Apertura in lettura FileA • Apertura in creazione FileB • ESEGUI MENTRE Not(Fine FileA) • Lettura di un record di FileA • Modifica, nel record (buffer di memoria), dei dati che si intendono aggiornare • Scrittura del record aggiornato in FileB • FINE-ESEGUI • Chiusura FileA • Chiusura FileB • Cancellazione FileA • Rinominare FileB con nome FileA 1 2 3 RecClienti 4 RecClienti.AnnoNascita= 1981 5 2 Bianchi Anna Roma 1981 3 …… fino alla fine del FileA
Aggiornamento di dati: codifica VB File sequenziali: modifica dei dati Ipotizziamo di dover cambiare l’anno di nascita di Anna Bianchi con il valore 1981 • Open “Clienti.dat” For Input As #1 • Open “Nuovo.dat” For Output As #2 • Do While Not EOF(1) • Input #1, RecClienti.Cognome, RecClienti.Nome, RecClienti.Luogo, RecClienti.AnnoNascita • If (RecClienti.Cognome=“Bianchi”) And (RecClienti.Nome=“Anna”) Then • RecClienti.AnnoNascita= 1981 • End If • Write #2, RecClienti.Cognome, RecClienti.Nome, RecClienti.Luogo, RecClienti.AnnoNascita • Loop • Close #1 • Close #2 • ‘Cancellazione file Clienti.dat • Kill “Clienti.dat • ‘Rinomina il nuovo file con nome Clienti.dat • Name “Nuovo.dat” As “Clienti.dat”
Bianchi Anna Roma 1980 Verdi Luca Milano 1960 Neri 1976 Andrea Torino Verdi Bianchi Anna Roma 1981 Paola Bari 1954 Cancellazione di record File sequenziali: modifica dei dati 1 • Apertura in lettura FileA • Apertura in creazione FileB • ESEGUI MENTRE Not(Fine FileA) • Lettura di un record di FileA • SE record da conservare ALLORA • Scrittura del record in FileB • FINE-SE • FINE-ESEGUI • Chiusura FileA • Chiusura FileB • Cancellazione FileA • Rinominare FileB con nome FileA 1 2 RecClienti 3 4 2 …… fino alla fine del FileA per tutti i record che si vogliono conservare
Cancellazione di record: codifica VB File sequenziali: modifica dei dati Ipotizziamo di dover cancellare tutti i clienti di Milano • Open “Clienti.dat” For Input As #1 • Open “Nuovo.dat” For Output As #2 • Do While Not EOF(1) • Input #1, RecClienti.Cognome, RecClienti.Nome, RecClienti.Luogo, RecClienti.AnnoNascita • If RecClienti.Luogo <> “Milano”) Then ‘si devono conservare i dati dei clienti che non ‘ risiedono a Milano • Write #2, RecClienti.Cognome, RecClienti.Nome, RecClienti.Luogo, RecClienti.AnnoNascita • End If • Loop • Close #1 • Close #2 • ‘Cancellazione file Clienti.dat • Kill “Clienti.dat • ‘Rinomina il nuovo file con nome Clienti.dat • Name “Nuovo.dat” As “Clienti.dat”
Open percorso For Random As #Numero Len=LunghezzaRecord File ad accesso casuale: apertura • percorso indica il nome fisico del file in memoria di massa, eventualmente corredato dal percorso • non esiste differenza, nella modalità di apertura, per operazioni di input e di output • #Numero e’ un numero, stabilito in genere dal programmatore, che identifica il file all’interno dell’applicazione • LunghezzaRecord fissa la dimensione del buffer di memoria, può essere calcolata tramite la funzione Len(…) • Len(RecAmici) restituisce la dimensione (in byte) del record RecAmici Esempio : Open “Amici.dat” For Random As #1 Len=Len(RecAmici)
File a accsso casuale: chiusura Close #Numero • #Numero e’ il numero del file che si desidera chiudere Esempio : Close #1
Put #Numero, [posizione], record File ad accesso casuale: scrittura • #Numero e’ il numero del file in cui si desidera scrivere • posizioneindica la posizione (numero di record) nel file in cui si vuole scrivere il record. • Questo parametro permette di determinare se il record deve essere aggiunto all’archivio o se deve essere sovrascritto ad uno già esistente. • Quest’ultima evenienza si verifica quando viene indicata una posizione già occupata da un record. • Per aggiungere un nuovo record al file, invece, è necessario indicare un numero pari al numero totale di record presenti in archivio, aumentato di una unità. • record contiene il record da scrivere nel file
Esempi File ad accesso casuale: scrittura • Modifica del record in posizione 8, registrando i dati prelevati da caselle di testo • RecAmici.Cognome= txtCognome • RecAmici.Nome= txtNome • RecAmici.Luogo= txtLuogo • RecAmici.AnnoNascita= Val(txtAnno) • Put #1,8,RecAmici • Aggiunta di un record in fondo al file, registrando i dati prelevati da caselle di testo • RecAmici.Cognome= txtCognome • RecAmici.Nome= txtNome • RecAmici.Luogo= txtLuogo • RecAmici.AnnoNascita= Val(txtAnno) • ‘Calcola il numero del nuovo record con la seguente formula: • ‘ (dimensione del file) \ (dimensione del record) + 1 • NumRec=LOF(1)\Len(RecAmici) + 1 • Put #1,NumrRec,RecAmici Numero di record presenti nel file Dimensione del file (in byte)
Get #Numero, [posizione], record File ad accesso casuale: lettura • #Numero e’ il numero del file in cui si desidera scrivere • posizioneindica la posizione (numero di record) nel file del record che si vuole leggere. • Tale valore può essere omesso solo in occasione di operazioni di lettura in sequenza; l’assenza di tale numero, indicante la posizione, provoca infatti l’accesso al record successivo a quello corrente. • Anche in caso di omissione della posizione, non possono però essere omesse le virgole • record indica il nome della variabile record nella quale verrà collocato il record letto
Esempi File ad accesso casuale: scrittura • Lettura del terzo record presente in archivio • Get #1,3,RecAmici • Lettura del record successivo rispetto a quello che è appena stato analizzato • Get #1,,RecAmici