4.11.3. Închiderea fişierelor
Închiderea fişierelor se realizează cu comanda FileClose, a cărei sintaxă este:
FileClose [listă fişiere] sau altfel spus
FileClose( [ # numărFişier1] [, # numărFişier2] [, # numărFişier3…] )
Dacă lista fişierelor ce trebuie închise lipseşte, atunci toate fişierele deschise cu FileOpen care sunt active în mod curent vor fi închise.
Când se închid fişierele care au fost deschise în mod Append sau Output, toate datele aflate în zona tampon asociată fişierului vor fi scrise în fişier înaintea închiderii fişierului. Prin închiderea unui fişier cu FileClose asocierea dintre fişier şi numărul său dispare.
4.11.4. Comenzi pentru fişiere secvenţiale
Fişierele secvenţiale sunt în general şiruri de caractere, dar pot fi şi combinaţii de şiruri de caractere şi de numere. În general se pot folosi următoarele două instrucţiuni pentru a scrie date într-un fişier cu acces secvenţial:
a). Scrierea datelor într-un fişier secvenţial se poate face cu comenzile:
Print(NumărFişier, listă_expresii)
sau
Write( NumărFişier, listă_expresii)
unde:
listă_expresii este o listă de variabile a căror valoare urmează să fie trecută în fişier.
Pentru a scrie o înregistrare goală, după număr fişier se precizează numai virgule.
Instrucţiunea WRITE este similară cu instrucţiunea PRINT , singura diferenţă între cele două instrucţiuni fiind că WRITE inserează virgule între termeni, şirurile de caractere sunt delimitate de ghilimele, iar numerele pozitive nu sunt precedate de spaţii.
Exemplu:
Fiind date două liste (una de nume şi corespunzător una de vârste) să se creeze un fişier secvenţial în care să se memoreze aceste date (numele şi vârsta fiecărui student).
Rezolvare:
Am proiectat forma şi am executat aplicaţia.
Codul sursă asociat evenimentului click al butonului de comandă Scrie în fişier este:
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles Button1.Click
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Output)
PrintLine(nrF, "PRIMUL TEST DE SCRIS INTR-UN FISIER")
PrintLine(nrF, "LA DATA DE", TAB(20), CDate(Today()))
PrintLine(nrF, New String(CChar("_"), 35))
PrintLine(nrF, "NUME PRENUME", TAB(20), "VARSTA")
PrintLine(nrF, New String(CChar("_"), 35))
For I = 0 To Me.nume.Items.Count - 1
PrintLine(nrF, Me.nume.Items.Item(I), TAB(20), _
Me.varsta.Items.Item(I))
Next I
FileClose(nrF)
End Sub
Codul asociat evenimentului click al butonului Exit:
Private Sub Button2_Click(ByVal sender As System.Object, _
ByVal e As System.EventArgs) Handles Button2.Click
End
End Sub
Verificând pe disc, fişierul fis1.txt există:
Conţinutul fişierului creat se prezintă astfel:
PRIMUL TEST DE SCRIS INTR-UN FISIER
LA DATA DE 12.02.2010
___________________________________
NUME PRENUME VARSTA
___________________________________
Student 1 20
Student 2 22
Student 3 18
Student 4 22
Student 5 24
Student 6 20
b) Citirea informaţiilor din fişiere cu acces secvenţial
Citirea informaţiilor din fişierele secvenţiale se face cu ajutorul instrucţiunilor:
Input(NumărFişier, ȘirCaractere)
LineInput(NmărFişier)
unde:
ŞirCaractere este o variabilă de tip String în care este preluată înregistrarea, ca şir de caractere;
LineInput returnează un șir de caractere
Citirea datelor dintr-un fişier binar se realizează într-un mod asemănător cu cel aleatoriu.
4.11.5. Alte funcţii pentru lucrul cu fişiere
În lucrul cu fişierele deosebit de importante sunt o serie de funcţii.
Funcţia Seek(NumărFişier) returnează ca valoare poziţia curentă de citire/scriere în cadrul uni fişier deschis cu instrucţiunea Open.
Funcţia LOF(NumărFişier) returnează mărimea fişierului exprimată în octeţi.
Funcţia EOF(NumărFişier) returneză valoarea logică True dacă s-a ajuns la sfârşitul unui fişier deschis în mod aleatoriu sau secvenţial şi False în caz contrar. Aceasta înseamnă că pentru a citi toate înregistrările de date dintr-un fişier ne vom folosi de testarea valorii acestei funcţii, într-o construcţie cum ar fi:
Exemplu:
Să se dezvolte aplicaţia anterioară şi să se completeze astfel încât, pe lângă crearea unui fişier secvenţial, să permită noi funcţiuni şi anume:
-
citirea şi vizualizarea datelor din fişierul creat;
-
adăugarea de noi înregistrări în fişier;
-
modificarea conţinutului unor înregistrări (selectate de utilizator);
-
ştergerea unor înregistrări care nu mai sunt de actualitate (selectate de utilizator).
Rezolvare:
Am proiectat forma, am prevăzut pentru fiecare dintre funcţiunile aplicaţiei câte un buton de comandă şi am scris codul sursă asociat acestora:
Executând aplicaţia se obţine:
Dacă se doreşte adăugarea de noi înregistrări în fişier, atunci se precedează astfel: se activează butonul de opţiuni ADAUGARE INREGISTRĂRI ÎN FIŞIER, se completează sus, în casetele de text datele (nume, vârstă) şi, pentru preluarea lor în listă se acţionează butonul ok.
După ce am preluat în listă datele studenţilor pe care vrem să-i adăugăm în fişier, acţionîm butonul SCRIE LISTA ÎN FIŞIER.
Vom vizualiza apoi datele existente în fişier acţionând butonul LISTEAZĂ.
Ca efect în lista din dreapta sunt afişate înregistrările existente acum în fişier, inclusiv cele adăugate.
Dacă se doreşte crearea din nou a fişierului cu elementele din listă, atunci se selectează opţiunea CREARE FIŞIER urmată de acţionarea butonului SCRIE LISTĂ ÎN FIŞIER. La acţionarea butonului LISTEAZĂ se vor vedea doar aceste înregistrări.
Se poate şterge apoi lista (din stânga) acţionând butonul STERGE LISTA.
Dacă se doreşte modificarea unei înregistrări din listă se procedează astfel:
-
se apasă butonul MODIFICARE ÎNREGISTRĂRI. Ca efect se deschide o nouă formă, Form2, în care conţinutul fişierului este trecut într-o listă. Utilizatorul selectează înregistrarea de modificat (al cărei conţinut se trece în caseta de text de deasupra listei) şi face modificările dorite.
Apăsând pe butonul ACCEPTA MODIFICARILE înregistrarea corectată trece din nou în listă şi se aşteaptă ca utilizatorul să efectueze, pe rând toate modificările dorite.
Urmează apoi preluarea în fişier a înregistrărilor din listă, deci cu corecţiile efectuate, acţionând butonul SCRIE MODIFICĂRILE ÎN FIŞIER. Se afişează din nou forma 1, cu lista fără elemente. Dacă cerem din nou o listare a fişierului (opţiunea LISTEAZĂ) se va observa că toate corecţiile noastre au fost preluate în fişier.
Pentru a şterge o înregistrare se procedează în mod similar: se apasă butonul STERGERE ÎNREGISTRĂRI , se afişează o nouă formă (FORM3) cu conţinutul fişierului afişat în listă; se alege din listă înregistrarea dorită şi ca efect ea va fi dusă în caseta de text pentru confirmare cu butonul ACCEPTA STERGERE. apoi se apasă butonul RESCRIE FISIER.
Ca efect apare din nou forma principală, în care putem lista din nou conţinutul fişierului, pentru a ne convinge că ştergerea a fost efectuată..
Cu EXIT se iese din aplicaţie.
Codul sursă asociat controalelor din cadrul aplicaţiei se prezintă astfel:
FORM1
'Declaraţii
Dim A1 As String
Dim I1 As Integer
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles Button6.Click
'Evenimentul click al butonului “Scrie în fişier”/ Form1
If Me.RadioButton1.Checked = True Then
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Output)
PrintLine(nrF, "PRIMUL TEST DE SCRIS INTR-UN FISIER")
PrintLine(nrF, "LA DATA DE", TAB(20), CDate(Today()))
PrintLine(nrF, New String(CChar("_"), 35))
PrintLine(nrF, "NUME PRENUME", TAB(20), "VARSTA")
PrintLine(nrF, New String(CChar("_"), 35))
For I = 0 To Me.nume.Items.Count - 1
PrintLine(nrF, Me.nume.Items.Item(I), TAB(20), Me.varsta.Items.Item(I))
Next I
FileClose(nrF)
End If
If Me.RadioButton2.Checked = True Then
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Append)
For I = 0 To Me.nume.Items.Count - 1
PrintLine(nrF, Me.nume.Items.Item(I), TAB(20), Me.varsta.Items.Item(I))
Next I
FileClose(nrF)
End If
End Sub
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles Button7.Click
'Evenimentul click al butonului EXIT
End
End Sub
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles Button5.Click
'Evenimentul click al butonului “MODIFICARE INREGISTRARI” din FORM1
Dim nrF As Integer = FreeFile()
Me.Hide()
Form2.listModif.Items.Clear()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Input)
Do While Not (EOF(nrF))
A1 = LineInput(nrF)
Form2.listModif.Items.Add(A1)
Loop
FileClose(nrF)
Form2.Show()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs) Handles Button1.Click
'Evenimentul click al butonului “OK” din FORM1
If Len(Trim(Me.TextBox1.Text)) > 0 Then
Me.nume.Items.Add(Me.TextBox1.Text)
Me.varsta.Items.Add(Me.TextBox2.Text)
Me.TextBox1.Text = ""
Me.TextBox2.Text = ""
End If
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs) Handles Button2.Click
'Evenimentul click al butonului “CLEAR LISTA” din FORM1
Me.nume.Items.Clear()
Me.varsta.Items.Clear()
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs) Handles Button4.Click
'Evenimentul click al butonului “LISTEAZA” din FORM1
Me.ListBox1.Items.Clear()
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Input)
Do While Not (EOF(nrF))
A1 = LineInput(nrF)
Me.ListBox1.Items.Add(A1)
Loop
FileClose(nrF)
End Sub
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs) Handles Button3.Click
'Evenimentul click al butonului “STERGERE INREGISTRARI” din ‘FORM1
Me.Hide()
Dim nrF As Integer = FreeFile()
Form3.LISTSTERG.items.Clear()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Input)
Do While Not (EOF(nrF))
A1 = LineInput(nrF)
Form3.listSterg.Items.Add(A1)
Loop
FileClose(nrF)
Form3.Show()
End Sub
Form2
‘Formă pentru modificarea înregistrărilor din fişier, preluate într-o listă care apoi se trece iar în fişier, modificată
'Declaraţii la nivel de formă
Dim I1 As Integer
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles Button3.Click
'Evenimentul click al butonului “SCRIE MODIFICARILE IN FISIER” din FORM2
Me.Hide()
Form1.Show()
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Output)
For I = 0 To Me.listModif.Items.Count - 1
PrintLine(nrF, Me.listModif.Items.Item(I))
Next I
FileClose(nrF)
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e _As System.EventArgs) Handles Button2.Click
'Evenimentul click al butonului “Anuleaza” din FORM2
Form1.Show()
Me.Hide()
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles Button1.Click
'Evenimentul click al butonului”Accepta Modificarile” din FORM2
If Len(Trim(Me.TextBox1.Text)) > 0 Then
Me.listModif.Items.Item(I1) = Me.TextBox1.Text
Me.TextBox1.Text = ""
End If
End Sub
Private Sub listModif_Click(ByVal sender As Object, ByVal e _
As System.EventArgs) Handles listModif.Click
'Evenimentul click al controlului casetă listă ”LISTMODIF” din FORM2 ‘prin care se preia în caseta text înregistrarea selectată din listă
I1 = Me.listModif.SelectedIndex
Me.TextBox1.Text = Me.listModif.Items.Item(I1)
End Sub
FORM3
‘Formă pentru ştergerea înregistrărilor din fişier, preluate într-o listă care ‘apoi se trece iar în fişier, modificată (fără înregistrările şterse)
‘Declaraţii la nivel de formă
Dim I1 As Integer
Private Sub Button3_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles Button3.Click
'Evenimentul click al controlului “RESCRIE FISIER” ‘din FORM3
Me.Hide()
Form1.Show()
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis1.txt", OpenMode.Output)
For I = 0 To Me.listSterg.Items.Count - 1
PrintLine(nrF, Me.listSterg.Items.Item(I))
Next I
FileClose(nrF)
End Sub
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles Button1.Click
'Evenimentul click al butonului “Accepta stergere” din FORM3
Me.listSterg.Items.RemoveAt(I1)
Me.TextBox1.Text = ""
End Sub
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles Button2.Click
'Evenimentul click al butonului “Anuleaza”din FORM3
Me.Hide()
Form1.Show()
End Sub
Private Sub listSterg_Click(ByVal sender As Object, ByVal e _
As System.EventArgs) Handles listSterg.Click
'Evenimentul click al controlului casetă listă “LISTSTERG” din FORM3 ‘prin care se preia pentru ştergere, în caseta text, înregistrarea selectată în ‘listă
I1 = Me.listSterg.SelectedIndex
Me.TextBox1.Text = Me.listSterg.Items.Item(I1)
End Sub
Exemplu pentru fişierele cu acces direct (RANDOM) :
Problemă:
Completaţi şi dezvoltaţi aplicaţia de mai sus pentru a permite şi crearea şi actualizarea unui fişier aleator.
Rezolvare:
Am adăugat pe forma principală opţiunea FIŞIER RANDOM.
Executând aplicaţia am creat fişierul, apoi am adăugat noi înregistrări, le-am vizualizat, le-am corectat întocmai ca în aplicaţia anterioară.
Codul sursă asociat obiectelor din FORM1 ce este forma prezentată mai sus se prezintă astfel:
.
'Declaraţii la nivel de formă
Dim A1 As String
Dim I1 As Integer
Structure persoana
Dim rNr As String
Dim rNume As String
Dim rVarsta As String
End Structure
Private Sub Button7_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles Button7.Click
'Evenimentul click al butonului “SCRIE LISTA IN FISIER”
If Me.RadioButton1.Checked = True Then 'fisier secvential
If Me.RadioButton3.Checked = True Then 'creare fisier
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis2.txt", OpenMode.Output)
PrintLine(nrF, "PRIMUL TEST DE SCRIS INTR-UN FISIER")
PrintLine(nrF, "LA DATA DE", TAB(20), CDate(Today()))
PrintLine(nrF, New String(CChar("_"), 35))
PrintLine(nrF, "NUME PRENUME", TAB(20), "VARSTA")
PrintLine(nrF, New String(CChar("_"), 35))
For I = 0 To Me.nume.Items.Count - 1
PrintLine(nrF, Me.nume.Items.Item(I), TAB(20), _
Me.varsta.Items.Item(I))
Next I
FileClose(nrF)
End If
If Me.RadioButton4.Checked = True Then 'adaugare inregistrari
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis2.txt", OpenMode.Append)
For I = 0 To Me.nume.Items.Count - 1
PrintLine(nrF, Me.nume.Items.Item(I), TAB(20), _
Me.varsta.Items.Item(I))
Next I
FileClose(nrF)
End If
End If
If Me.RadioButton2.Checked = True Then 'fisier random
If Me.RadioButton3.Checked = True Then 'creare fisier
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis3.txt", OpenMode.Output)
FileClose(nrF)
FileOpen(nrF, "d:\work\vb\fis3.txt", OpenMode.Random)
Dim scrie As persoana
For I3 = 0 To Me.nume.Items.Count - 1
scrie.rNr = I3 + 1
scrie.rNume = Me.nume.Items.Item(I3)
scrie.rVarsta = Me.varsta.Items.Item(I3)
FilePut(nrF, scrie, I3 + 1)
Next I3
FileClose(nrF)
End If
If Me.RadioButton4.Checked = True Then 'adaugare inregistrari
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis3.txt", OpenMode.Random)
Dim I4 As Integer = 1
Dim scrie As New persoana
Do While Not (EOF(nrF))
FileGet(nrF, scrie, I4)
I4 = I4 + 1
Loop
For I3 = 0 To Me.nume.Items.Count - 1
scrie.rNr = I4 + I3
scrie.rNume = Me.nume.Items.Item(I3)
scrie.rVarsta = Me.varsta.Items.Item(I3)
FilePut(nrF, scrie, I4 + I3)
Next I3
FileClose(nrF)
End If
End If
End Sub
Private Sub Button4_Click(ByVal sender As System.Object, ByVal e _ As System.EventArgs) Handles Button4.Click
'Evenimentul click al butonului “Exit”
End
End Sub
Private Sub Button6_Click(ByVal sender As System.Object, ByVal e _
As System.EventArgs) Handles Button6.Click
'Evenimentul click al butonului “MODIFICARE INREGISTRARI” ce ‘deschide “FORM2” formă în care se vor efectua modificările după ce ‘încarcă în lista “LISTMODIF” din această formă înregistrările din fişier
Me.Hide()
Form2.ListModif.Items.Clear()
Form2.ListBox1.Items.Clear()
Form2.ListBox2.Items.Clear()
If Me.RadioButton1.Checked = True Then
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis2.txt", OpenMode.Input)
Do While Not (EOF(nrF))
A1 = LineInput(nrF)
Form2.ListModif.Items.Add(A1)
Loop
FileClose(nrF)
Form3.Show()
End If
If Me.RadioButton2.Checked = True Then
Form2.ListModif.Items.Clear()
Dim nrF As Integer = FreeFile()
FileOpen(nrF, "d:\work\vb\fis3.txt", OpenMode.Random)
Dim I4 As Integer = 1
Dim scrie As New persoana
Do While Not (EOF(nrF))
FileGet(nrF, scrie, I4)
Form2.ListBox1.Items.Add(scrie.rNr)
Form2.ListModif.Items.Add(scrie.rNume)
Form2.ListBox2.Items.Add(scrie.rVarsta)
I4 = I4 + 1
Loop
FileClose(nrF)
Form2.Show()
End If
Dostları ilə paylaş: |