Page 1 sur 1
Fichier accès direct vb6 => purebasic
Publié : mar. 04/févr./2014 6:47
par Altix
Bonjour,
Pour écrire ou lire dans un fichier en accès direct en visual basic 6 il fallait écrire le code suivant :
Type Enrg ' Définition du format de l'enregistrement
Nom As String * 10
Prenom As String * 10
Age As integer
End Type
Dim Eng As Enrg
Open "Fichier.txt" For Random As #1 len(Eng)
Put # 1, 5,Eng ' Ecrit dans le 5è enregistrement
Get # 1,5,Eng ' Lit dans le 5è enregistrement
Close#1
Quel est le code équivalent en purebasic ?
Je suis un peu perdu
Merci de vos réponses
Re: Fichier accès direct vb6 => purebasic
Publié : mar. 04/févr./2014 10:18
par Micoute
Bonjour Altix,
Voici un code écrit par MLD et je pense qu'il ne m'en tiendra pas grief, vu qu'il l'avais déjà mis sur ce forum en 2009
Code : Tout sélectionner
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
;¤¤¤ MLD le 10/12/2009 ¤¤¤
;¤¤¤ PB 4.40 ¤¤¤
;¤¤¤ fichiers a accés direct ¤¤¤
;¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤
;Principe
;Pour enregistrer: indiquer le numéro d'enregistrement, que c'est un enregistrement, la variable d'enregistrement
; et une variable string de cette façon "variable"
;Pour lire: indiquer le numéro d'enregistrement, que c'est une lecture, la variable d'enregistrement ,
;et une variable vide ""
;Pour obtenir le nombre d'enregistrement : Appelez le procédure avec un numéro d'enregistrement quelconque, et
; toutes les autres variables vide ""
Structure Personne
Nom.w
Prenom.w
Age.w
EndStructure
Global Dim Personne.Personne(1)
Personne(1) \Nom.w = 20
Personne(1) \Prenom.w = 10
Personne(1) \Age.w = 5
Global Nbenr.l
Procedure.s fichierAD(Numenr.w,es.s,varenr.s,var.s)
longlig.w = (Personne(1)\Nom.w + Personne(1)\Prenom.w + Personne(1)\Age.w);longeur d'un enr
Posdepling.w = ((Numenr.w * longlig.w)- longlig.w);position de départ des enr
PosNom.w = Posdepling.w
PosPrenom.w = Posdepling.w + Personne(1)\Nom.w ;+1
PosAge.w = Posdepling.w + (Personne(1)\Nom.w + Personne(1)\Prenom.w); + 1
OpenFile(1,"essai.fad")
If Lof(1) =0
WriteString(1,Space(longlig.w))
Nbenr.l = Lof(1)/longlig.w
Else
Nbenr.l = Lof(1)/longlig.w
EndIf
CloseFile(1)
Select es.s
Case "enrg"
If Numenr.w = (Nbenr.l +1);Prépare les champs pour un nouveau enrg
OpenFile(1,"essai.fad")
FileSeek(1,Lof(1))
WriteString(1,Space(longlig.w))
Nbenr.l = Lof(1)/longlig.w
EndIf
If Numenr <= Nbenr.l ; évite un plantage
OpenFile(1,"essai.fad")
Select varenr
Case "Nom"
FileSeek(1,PosNom.w)
enrnom$ = var + Space(Personne(1)\Nom.w - Len(var)) ; comble le champ avec des espaces
WriteString(1,enrnom$)
Case "Prenom"
FileSeek(1,PosPrenom.w )
enrPrenom$ = var + Space(Personne(1)\Prenom.w - Len(var)) ; comble le champ avec des espaces
WriteString(1,enrPrenom$)
Case "Age"
FileSeek(1,PosAge.w)
enrAge$ = var + Space(Personne(1)\Age.w - Len(var)) ; comble le champ avec des espaces
WriteString(1, enrAge$)
EndSelect
CloseFile(1)
EndIf
Case "lect"
If Numenr <= Nbenr.l ; évite un plantage
OpenFile(1,"essai.fad")
Select varenr
Case "Nom"
FileSeek(1,PosNom.w)
lect.s = Trim(Mid(ReadString(1),1, Personne(1)\Nom.w ))
Case "Prenom"
FileSeek(1,PosPrenom.w)
lect.s = Trim(Mid(ReadString(1),1, Personne(1)\Prenom.w ))
Case "Age"
FileSeek(1,PosAge.w)
lect.s = Trim(Mid(ReadString(1),1, Personne(1)\Age.w ))
CloseFile(1)
EndSelect
ProcedureReturn lect.s
EndIf
EndSelect
EndProcedure
For x=1 To 50
fichierAD(x,"enrg","Nom","Lye" +Str(x))
fichierAD(x,"enrg","Prenom","Michel"+Str(x))
fichierAD(x,"enrg","Age",Str(x))
Next
;Pour lire le fichier enlevez les ;
fichierAD(1,"","",""); on appel le fichier pour avoir le nombre d'enregistrement
maxenr.w = Nbenr.l
For y =1 To maxenr.w Step 2
Debug "Nom: " + fichierAD(y,"lect","Nom","")+ " " + "Prénom: " + fichierAD(y,"lect","Prenom","") + " " + "Age: " + fichierAD(y,"lect","Age","")
Next
End
Fait en bon usage.
Re: Fichier accès direct vb6 => purebasic
Publié : mar. 04/févr./2014 10:52
par Fig
Bonjour, ce type de lecture d'un fichier en accès direct n'existe pas en PB, par défaut.
On peut ruser avec fileseek(), mais le plus simple est de travailler dans la mémoire vive, puis de sauvegarder tout le fichier sur le disque,
si ton fichier n'est pas trop volumineux, ça fonctionnera très bien.
Sinon, il faudra utiliser les instructions liées à la gestion de database. (je ne les ai jamais essayé personnellement)
Je te propose une version en mémoire vive qui est la plus simple.
Code : Tout sélectionner
Structure Enrg
Nom.s
Prenom.s
Age.i
EndStructure
Dim Enrg.Enrg(10)
file$=GetHomeDirectory()+"test.txt"
;créer un fichier test.txt contenant 10 enregistrements
If CreateFile(0,file$)
For i=1 To 10
WriteStringN(0,"Pignon ")
WriteStringN(0,"Francois ")
WriteStringN(0,Str(36+i))
Next i
CloseFile(0)
Else
MessageRequester("Information","may not create the file!")
EndIf
;Au début du programme on charge ton fichier
;lit le contenu du fichier
Debug "contenu du fichier au début"
If ReadFile(0, file$) ;permet uniquement de lire le contenu du fichier
i=0
While Eof(0)=0
i+1
Enrg(i)\Nom=ReadString(0)
Enrg(i)\Prenom=ReadString(0)
Enrg(i)\age=Val(ReadString(0))
Debug Enrg(i)\Nom
Debug Enrg(i)\Prenom
Debug Enrg(i)\age
Wend
CloseFile(0)
Else
MessageRequester("Information","may not read the file!")
EndIf
Debug" "
;pendant l'exécution du programme, on fait les changements souhaités
;On change l'enregistrement 5 par exemple
Enrg(5)\Age=12
enrg(5)\Nom="Doe"
Enrg(5)\Prenom="John"
;à la fin du programme on sauvegarde le fichier
;enregistre les changement du fichier
Debug "Contenu du fichier après modification"
Debug " "
If OpenFile(0, file$) ;permet de lire ou d'écrire le contenu du fichier
For i=1 To 10
WriteStringN(0,Enrg(i)\Nom)
WriteStringN(0,Enrg(i)\Prenom)
WriteStringN(0,Str(Enrg(i)\Age))
;affiche le contenu du fichier
Debug Enrg(i)\Nom
Debug Enrg(i)\Prenom
Debug Enrg(i)\Age
Next i
CloseFile(0)
Else
MessageRequester("Information","may not read the file!")
EndIf
Re: Fichier accès direct vb6 => purebasic
Publié : mar. 04/févr./2014 10:53
par Fig
Pour fileseek, voir poste de Micoute qui a été plus rapide que moi... Tu as donc deux méthodes différentes.