cour-fichiers

Page 1

Programmation événementielle :

Fichiers I - Les fichiers à accès séquentiels a) Ouverture d’un fichier séquentiel : Visual Basic possède les fonctions fondamentales de gestion de fichiers séquentiels, à accès direct et binaires. Quel que soit le mode de gestion adopté, nous ouvrirons les fichiers à l'aide de l'instruction "Open" et nous les fermerons avec l'instruction "Close". La syntaxe de l’instruction Open est la suivante : Open Nom_fichier For Mode [LOCK] As #identificateur fichier mode : - Input : Entrée séquentielle. - Output : Sortie séquentielle. - Append : Sortie séquentielle ajoutée à la fin d'un fichier existant. Lock : Le fichier peut, avec l'un des mots-clés suivants, être doté de certains droits d'accès autres que Lock : - Shared : Tout programme peut accéder au fichier et lire ou écrire des données. - Lock Read : Aucun autre programme ne peut lire des données dans ce fichier. - Lock Write : Aucun autre programme ne peut écrire de données dans ce fichier. Identificateur fichier : Expression numérique comprise entre 1 et 255 donnant le numéro de fichier. Exemple: Open "C:\WINDOWS\SYSTEM\DATA.DAT" For Input Lock Read As #2 b) Lecture d’un fichier séquentiel : Il existe trois façons de lire un fichier séquentiel : - Input #Numéro_fichier, variable1, variable2, ….. (lecture de plusieurs données en les stockant dans des variables distingues -

Line input # Numéro_fichier, variable (lecture d’une ligne complète en la stockant dans une seule variable.

-

Variable = Input(nombre de caractères, Numéro_fichier) (lecture un nombre de caractères en les stockant dans une seule variable.

c) Ecriture dans un fichier séquentiel : Il existe deux fonctions d’écriture dans un fichier séquentiel :

M. Bouaabid

-1-


Programmation événementielle : -

Write #Numéro_fichier, var1, var2, …….. (écrit une série de valeurs séparées par des virgules et entourées par des guillemets)

-

Print #Numéro_fichier, var1, var2, ….. (écrit une série de valeurs séparées par un caractère de tabulation)

Dans les deux cas, si on termine chaque instruction d’écriture un point virgule, le retour à la ligne sera ignoré. d) Obtenir un numéro libre pour un fichier Si on manipule plusieurs fichier et pour éviter la redondance des numéros de ces fichiers, on utilise la fonction freefile Exemple dim n as integer n = freefile e) Récupérer la taille d’un fichier : Il existe deux méthodes de connaître la taille d’un fichier : - Lof(Num_Fichier) - FileLen(Nom_Fichier) f) Détecter l’atteinte de la fin d’un fichier : La fonction EOF(numéro du fichier) retourne true si la fin du fichier est atteinte. g) Exemples d’application : Exemple 1 :

Cette interface permet de lire un fichier texte existant et de l’afficher sur la zone texte, ceci est fait à la suite d’un click sur le bouton Afficher. Le code complet de cette application est le suivant : Private Sub cmdAff_Click() Dim n As Integer

M. Bouaabid

-2-


Programmation événementielle : n = FreeFile Open "data.txt" For Input As #n txtAff = Input(LOF(n), n) Close #n End Sub ‘--------------------------------------------------------------------------------------Private Sub cmdFin_Click() Dim n As Integer n = MsgBox("Voulez-vous quitter?", vbYesNo + vbDefaultButton2 + vbQuestion, "Choix") If n = vbYes Then End End Sub On peut ajouter dans le code un gestionnaire d’erreur en précédant l’instruction susceptible de provoquer une erreur par l’instruction : On error goto etiquette Le code d’affichage devient : Private Sub cmdAff_Click() Dim n As Integer n = FreeFile On Error GoTo et Open "data1.txt" For Input As #n txtAff = Input(LOF(n), n) Close #n Exit Sub et: MsgBox "erreur d'ouverture du fichier" End Sub Exemple 2 :

Cette application ressemble à la première mais elle permet d’enregistrer les modifications apportées sur le fichier affiché.

M. Bouaabid

-3-


Programmation événementielle : Private Sub cmdEcrire_Click() Dim n As Integer n = FreeFile On Error GoTo et Open "data.txt" For Output As #n Print #n, txtAff Close #n Exit Sub et: MsgBox "erreur d'ouverture du fichier" End Sub Exemple 3 : On veut créer une application permettant de créer une copie, ligne par ligne, d’un fichier texte existant nommé doc1.txt dans un autre fichier nommé doc2.txt  Private Sub cmdCopie_Click() Dim s As String On Error GoTo et Open "doc1.txt" For Input As #1 Open "doc2.txt" For Output As #2 While Not EOF(1) Line Input #1, s Print #2, s Wend Close #1 Close #2 Exit Sub et: MsgBox "erreur d'ouverture du fichier" End Sub On veut modifier le code précédent de telle façon qu’on recopie uniquement les lignes commençant par le mot DEVICE et ceci quel que soit sa casse.  Private Sub cmdCopie_Click() Dim s As String On Error GoTo et Open "doc1.txt" For Input As #1 Open "doc2.txt" For Output As #2 While Not EOF(1) Line Input #1, s If UCase(Left(s, 6)) = "DEVICE" Then Print #2, s End If Wend

M. Bouaabid

-4-


Programmation événementielle : Close #1 Close #2 Exit Sub et: MsgBox "erreur d'ouverture du fichier" End Sub Exemple 4 : On veut lire la quatrième ligne d’un fichier texte existant (nommé : data.txt) à partir du 6ème caractère. On utilisera l’instruction : seek#numéro de fichier,n ‘ déplacement de n caractères au sein d’un fichier et seek(numéro de fichier) retourne la position courante au sein d’un fichier ouvert.  Private Sub cmdAff_Click() Dim n As Integer Dim s As String Dim i As Integer n = FreeFile On Error GoTo et Open "doc1.txt" For Input As #n For i = 1 To 3 Line Input #n, s Next Seek #n, (Seek(n) + 6) Input #n, s txtAff = s Close #n Exit Sub et: MsgBox "erreur d'ouverture du fichier" End Sub h) Autres fonctions des fichiers : Le tableau suivant résume le rôle de quelques fonctions appliquées aux fichiers : Commande ChDir CurDrive Dir FileCopy FileDateTime GetAttr Kill MkDir

M. Bouaabid

Action Change le répertoire courant Change le lecteur courant Revoie un nom de fichier ou répertoire correspondant à un modèle ou un attribut de fichier Copie un fichier Revoie la date et le temps de la dernière modification du fichier Renvoie une valeur qui représente un attribut d’un fichier Efface un fichier Crée un nouveau répertoire

-5-


Programmation événementielle : RmDir SetAttr

Efface un répertoire vide Change l’attribut d’un fichier

i) Travail demandé : Liste des étudiants 1) Dans un module nommé Etudiant, créer un type contenant nom de 20 caractères au maximum et un entier nommé age. 2) Déclarer deux variable globales currentrec et lastrec de type long permettant de préciser respectivement l’enregistrement courant et le dernier enregistrement. 3) Au démarrage, la procédure main sera lancée et on y initialise les deux variables précédentes, la première par 1 et la deuxième par le nombre de ligne de notre fichier de base de données nommé data.txt. L’interface de notre application est la suivante :

4) Donner le code des boutons suivant : cmdFirst, cmdLast, cmdPrevious, cmdNext,cmdAdd, cmdDel et cmdSearch.  Dans le module on a le code suivant : Type Etudiant nom As String * 20 age As Integer End Type ‘-------------------------------------------------------------------Global currentrec, lastrec As Long Global e As Etudiant ‘-------------------------------------------------------------------Sub main() Dim i As Integer Dim s As String currentrec = 1 i=0

M. Bouaabid

-6-


Programmation événementielle : Open "data.txt" For Input As #1 If (LOF(1)) = 0 Then lastrec = 1 Else While Not EOF(1) Line Input #1, s i=i+1 Wend lastrec = i End If 'MsgBox lastrec Close #1 Form1.Show End Sub Dans la form, on le code suivant : Private Sub cmdFin_Click() Dim n As Integer n = MsgBox("Voulez-vous quitter?", vbYesNo + vbDefaultButton2 + vbQuestion, "Choix") If n = vbYes Then End End Sub ‘----------------------------------------------------------------------------------------Private Sub cmdAdd_Click() If FileLen("data.txt") <> 0 Then Open "data.txt" For Append As #1 Else Open "data.txt" For Output As #1 End If lire Write #1, e.nom, Str(e.age) Close #1 lastrec = lastrec + 1 currentrec = lastrec affiche End Sub ‘----------------------------------------------------------------------------------------Private Sub affiche() txtNom = e.nom txtAge = e.age aff = "Enregistrement : " & Str(currentrec) & " / " & Str(lastrec) End Sub ‘----------------------------------------------------------------------------------------Private Sub lire() e.nom = txtNom e.age = txtAge End Sub ‘----------------------------------------------------------------------------------------Private Sub cmdDel_Click() Dim s, s1, s2 As String

M. Bouaabid

-7-


Programmation événementielle : If FileLen("data.txt") = 0 Then MsgBox "impossible de supprimer" Exit Sub End If s = txtNom Open "data.txt" For Input As #1 Open "temp.txt" For Output As #2 i=0 Do While Not (EOF(1)) Input #1, s1, s2 If UCase(Trim(s1)) <> UCase(Trim(s)) Then 'MsgBox s1 & " " & s Write #2, s1, s2 End If Loop Close #1 Close #2 Kill ("data.txt") Name "temp.txt" As "data.txt" lastrec = lastrec - 1 cmdPrevious_Click End Sub ‘----------------------------------------------------------------------------------------Private Sub cmdFirst_Click() Dim s1, s2 As String currentrec = 1 Open "data.txt" For Input As #1 Input #1, s1, s2 'MsgBox s1 & vbCrLf & s2 e.nom = s1 e.age = s2 affiche Close #1 End Sub ‘----------------------------------------------------------------------------------------Private Sub cmdLast_Click() Dim s1, s2 As String currentrec = lastrec Open "data.txt" For Input As #1 For i = 1 To lastrec - 1 Line Input #1, s1 Next Input #1, s1, s2 e.nom = s1 e.age = s2 affiche Close #1 End Sub ‘-----------------------------------------------------------------------------------------

M. Bouaabid

-8-


Programmation événementielle : Private Sub cmdNext_Click() If currentrec = lastrec Then MsgBox "Dernier enregistrement" Else currentrec = currentrec + 1 Open "data.txt" For Input As #1 For i = 1 To currentrec - 1 Line Input #1, s1 Next Input #1, s1, s2 e.nom = s1 e.age = s2 affiche Close #1 End If End Sub ‘----------------------------------------------------------------------------------------Private Sub cmdPrevious_Click() If currentrec = 1 Then MsgBox "Premeier enregistrement" Else currentrec = currentrec - 1 Open "data.txt" For Input As #1 For i = 1 To currentrec - 1 Line Input #1, s1 Next Input #1, s1, s2 e.nom = s1 e.age = s2 affiche Close #1 End If End Sub ‘----------------------------------------------------------------------------------------Private Sub cmdSearch_Click() Dim s, s1, s2 As String Dim trouve As Boolean trouve = False s = InputBox("Entrer le nom à rechercher", "Recherche") If FileLen("data.txt") = 0 Then MsgBox "nom non trouvé" Exit Sub End If Open "data.txt" For Input As #1 i=0 Do While Not (EOF(1)) Input #1, s1, s2 i=i+1 If UCase(Trim(s)) = UCase(Trim(s1)) Then trouve = True

M. Bouaabid

-9-


Programmation événementielle : Exit Do End If Loop If trouve = True Then currentrec = i e.nom = s1 e.age = s2 affiche MsgBox "Nom trouvé" Else MsgBox "Nom non trouvé" End If Close #1 End Sub ‘----------------------------------------------------------------------------------------Private Sub Form_Load() cmdFirst_Click End Sub

II- Les fichiers à accès aléatoire a) Ouverture d’un fichier aléatoire : L'instruction "Open" permet aussi d’ouvrir ce type de fichier et la fermeture se fait avec l'instruction "Close". La syntaxe de l’instruction Open est la suivante : Open Nom_fichier For Random [LOCK] As #identificateur fichier len longueur de l’enregistrement Exemple: Open "C:\WINDOWS\SYSTEM\DATA.DAT" For Random Lock Read As #2 len 40 b) Lecture d’un fichier aléatoire : Il existe une seule façon de lire ce type de fichier : -

Get #Numéro_fichier, position, variable (lecture d’un enregistrement à la position précisée et le stockant dans la variable)

c) Ecriture dans un fichier séquentiel : Il existe deux fonctions d’écriture dans un fichier séquentiel : -

Put #Numéro_fichier, position, variable (écrit un enregistrement à une position précise dans un fichier)

M. Bouaabid

- 10 -


Programmation événementielle : d) Exemple d’application : Liste des étudiants 1) Dans un module nommé Etudiant, créer un type contenant nom de 20 caractères au maximum et un entier nommé age. 2) Déclarer deux variable globales currentrec et lastrec de type long permettant de préciser respectivement l’enregistrement courant et le dernier enregistrement. 3) Au démarrage, la procédure main sera lancée et on y initialise les deux variables précédentes, la première par 1 et la deuxième par le nombre de ligne de notre fichier de base de données nommé data.txt. L’interface de notre application est la suivante :

4) Donner le code des boutons suivant : cmdFirst, cmdLast, cmdPrevious, cmdNext,cmdAdd, cmdDel et cmdSearch.  Dans le module, on le code suivant : Type Etudiant nom As String * 20 age As Integer End Type ‘------------------------------------------------------------Global currentrec, lastrec As Long Global e As Etudiant ‘-------------------------------------------------------------Sub main() Dim i As Integer Dim s As String currentrec = 1 i=0 Open "data.txt" For Random As #1 Len = Len(e) If (LOF(1)) = 0 Then lastrec = 1

M. Bouaabid

- 11 -


Programmation événementielle : Else lastrec = LOF(1) / Len(e) End If Form1.Show End Sub Dans la form, on le code suivant : Private Sub cmdFin_Click() Dim n As Integer n = MsgBox("Voulez-vous quitter?", vbYesNo + vbDefaultButton2 + vbQuestion, "Choix") If n = vbYes Then End End Sub ‘---------------------------------------------------------------------------------------Private Sub cmdAdd_Click() If FileLen("data.txt") <> 0 Then lastrec = lastrec + 1 currentrec = lastrec Else currentrec = 1 lastrec = 1 End If lire affiche End Sub ‘---------------------------------------------------------------------------------------Private Sub affiche() Get #1, currentrec, e txtNom = e.nom txtAge = e.age aff = "Enregistrement : " & Str(currentrec) & " / " & Str(lastrec) End Sub ‘---------------------------------------------------------------------------------------Private Sub lire() e.nom = txtNom e.age = txtAge Put #1, currentrec, e End Sub ‘---------------------------------------------------------------------------------------Private Sub cmdDel_Click() Dim s As String If FileLen("data.txt") = 0 Then MsgBox "impossible de supprimer" Exit Sub End If s = txtNom Open "temp.txt" For Random As #2 Len = Len(e) j=1 For i = 1 To lastrec Get #1, i, e

M. Bouaabid

- 12 -


Programmation événementielle : If UCase(Trim(e.nom)) <> UCase(Trim(s)) Then 'MsgBox s1 & " " & s Put #2, j, e j=j+1 End If Next Close #1 Close #2 Kill ("data.txt") Name "temp.txt" As "data.txt" Open "data.txt" For Random As #1 Len = Len(e) lastrec = lastrec - 1 cmdPrevious_Click End Sub ‘---------------------------------------------------------------------------------------Private Sub cmdFirst_Click() currentrec = 1 affiche End Sub ‘---------------------------------------------------------------------------------------Private Sub cmdLast_Click() currentrec = lastrec affiche End Sub ‘---------------------------------------------------------------------------------------Private Sub cmdNext_Click() If currentrec = lastrec Then MsgBox "Dernier enregistrement" Else currentrec = currentrec + 1 affiche End If End Sub ‘---------------------------------------------------------------------------------------Private Sub cmdPrevious_Click() If currentrec = 1 Then MsgBox "Premeier enregistrement" Else currentrec = currentrec - 1 affiche End If End Sub ‘---------------------------------------------------------------------------------------Private Sub cmdSearch_Click() Dim s As String Dim trouve As Boolean trouve = False s = InputBox("Entrer le nom à rechercher", "Recherche") If FileLen("data.txt") = 0 Then MsgBox "nom non trouvé"

M. Bouaabid

- 13 -


Programmation événementielle : Exit Sub End If For i = 1 To lastrec Get #1, i, e If UCase(Trim(s)) = UCase(Trim(e.nom)) Then trouve = True Exit For End If Next If trouve = True Then currentrec = i affiche MsgBox "Nom trouvé" Else MsgBox "Nom non trouvé" End If End Sub ‘---------------------------------------------------------------------------------------Private Sub Form_Load() cmdFirst_Click End Sub ‘---------------------------------------------------------------------------------------Private Sub Form_Unload(Cancel As Integer) Close #1 End Sub

III- Les fichiers binaires Ce type de ces fichiers permet de lire n’importe quel type de fichier. a) Ouverture d’un fichier binaire : L'instruction "Open" permet aussi d’ouvrir ce type de fichier et la fermeture se fait avec l'instruction "Close". La syntaxe de l’instruction Open est la suivante : Open Nom_fichier For Binary [LOCK] As #identificateur fichier Exemple: Open "C:\WINDOWS\SYSTEM\DATA.DAT" For Binary Lock Read As #2 b) Lecture et écriture dans un fichier binaire: Ces deux opérations ressemblent à celle du fichier aléatoire, la différence réside dans le nombre d’octets de déplacement entre deux données successives. Dans le précédent type, cette taille est fixe et elle est précisée lors de l’ouverture du fichier via l’attribut len, dans le type courant c’est au développeur de la préciser à chaque déplacement au sein de ce type de fichier.

M. Bouaabid

- 14 -


Programmation événementielle : c) Exemple d’application : L’application traitée par les fichiers aléatoire, on veut l’adapter pour fonctionner avec les fichiers binaires.

M. Bouaabid

- 15 -


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.