Fichier accès direct vb6 => purebasic

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Altix
Messages : 1
Inscription : ven. 25/janv./2013 21:52

Fichier accès direct vb6 => purebasic

Message 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
Avatar de l’utilisateur
Micoute
Messages : 2584
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Fichier accès direct vb6 => purebasic

Message 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.
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 6.20 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Fichier accès direct vb6 => purebasic

Message 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
Dernière modification par Fig le mar. 04/févr./2014 10:57, modifié 2 fois.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Avatar de l’utilisateur
Fig
Messages : 1176
Inscription : jeu. 14/oct./2004 19:48

Re: Fichier accès direct vb6 => purebasic

Message par Fig »

Pour fileseek, voir poste de Micoute qui a été plus rapide que moi... Tu as donc deux méthodes différentes.
Il y a deux méthodes pour écrire des programmes sans erreurs. Mais il n’y a que la troisième qui marche.
Version de PB : 6.00LTS - 64 bits
Répondre