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.