Enregistrements erronés avec accès "random" aux fichiers

Résolu
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 - 11 avril 2007 à 14:51
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 - 12 avril 2007 à 23:51
bonjour à toutes et tous

je veux faire un accès à des enregistrement dans un fichier texte et j'utilise le mode "Random" mais bizarement les résultats obtenu ne correspondent pas du tout aux données enregistrées, je n'arrive pas à voir qu'elle est l'erreur que j'ai comis!!!

Type Ty_enreg_ext
    num_dico As Byte
    num_mot_ext As Long
    nb_let_av As Byte
    nb_let_ap As Byte
End Type

 F2 = FreeFile
 Open App.Path & "\Dico_ext_" & niv & ".txt" For Random As #F2 Len = Len_ext
    Get F2, ind_ext, enreg_ext 'lit l'enregistrement dans le dico_ext du niveau à l'indexe ind_ext

'ind_ext ayant ici la valeur 1 donc le premier enregistrement du fichier , je devrais normalement si je lis l'enregistrement "enreg_ext" avoir les valeurs de num_dico,  num_mot , nb_let_av et nb_let_ap , mais là impossible j'obtiens bien des valeurs mais que je ne retrouve nulle part dans les fichiers, pourtant essayé d'initialisé enreg_ext en mettant chaque valeur à zéro, mais rien n'y fait.
 j'ai vérifié que j'avais bien les bons enregistrement en ouvrant  le fichier avec "input"
 F2 = FreeFile
 Open App.Path & "\Dico_ext_" & niv & ".txt" For Input As #F2 'Len = Len_ext
 Input #F2, num_dico, num_mot, let_av, let_ap
 Close F2
'comme c'est le premier enregistrement je peux facilement controlé les valeurs!!

'j'ai enregistré le fichier initialement en veillant à ce que les valeurs aie bien la bonne définition "byte", ect

'j'ai même créé un fichier texte avec un seul enregistrement du type 1,2,3,4  et là surprise les valeurs de "enreg_ext" ont toujours les mêmes valeurs, je ne comprends pas d'où elles viennent??

si vous m'avez compris et que vous voyez mon erreur je suis preneur


 

12 réponses

Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
11 avril 2007 à 22:43
Bonjour,
j'ai essayé ton test 1,2,3,4 et ça marche très bien chez moi.
étant donné que tu arrives à lire le fichier avec input, tu n'as certainement pas écris ton fichier correctement
il doit être écrit avec accès Random et non pas avec accès Output

Private Type Ty_enreg_ext
    num_dico    As Byte
    num_mot_ext As Long
    nb_let_av   As Byte
    nb_let_ap   As Byte
End Type

Private Sub Command1_Click()
    Dim enreg_ext As Ty_enreg_ext
   
'   ECRITURE
    Open App.Path & "\Dico_ext_" & niv & ".txt" For Random As #1 Len = Len(enreg_ext)
    enreg_ext.num_dico = 1
    enreg_ext.num_mot_ext = 2
    enreg_ext.nb_let_av = 3
    enreg_ext.nb_let_ap = 4
    Put #1, 1, enreg_ext
    Close #1
   
End Sub

Private Sub Command2_Click()
    Dim enreg_ext As Ty_enreg_ext

'   LECTURE
    Open App.Path & "\Dico_ext_" & niv & ".txt" For Random As #1 Len = Len(enreg_ext)
    Get #1, 1, enreg_ext
    Close #1
    MsgBox enreg_ext.num_dico
    MsgBox enreg_ext.num_mot_ext
    MsgBox enreg_ext.nb_let_av
    MsgBox enreg_ext.nb_let_ap
  
End Sub

d'autre part tu devrais organiser ton type autrement (tu perd des caractères)

Private Type Ty1_enreg_ext
    num_dico    As Byte
    num_mot_ext As Long
    nb_let_av   As Byte
    nb_let_ap   As Byte
End Type

Private Type Ty2_enreg_ext
    num_mot_ext As Long
    num_dico    As Byte
    nb_let_av   As Byte
    nb_let_ap   As Byte
End Type

Private Sub Form_Load()
    Dim enreg1_ext As Ty1_enreg_ext
    Dim enreg2_ext As Ty2_enreg_ext

    MsgBox LenB(enreg1_ext)   '12 = 1 + 3 + 4 + 1 + 1 + 2     (perte de 5)
    MsgBox LenB(enreg2_ext)   '  8 = 4 + 1 + 1 + 1 + 1            (perte de 1)

End Sub

Daniel
3
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
12 avril 2007 à 20:51
je reviens,
en effet ton fichier est en binaire, tout au moins à cause du Long, pour le Byte c'est des caractères, donc ça dépend de ce qu'il y a dedans.
les données dans un type sont cadrées sur 4 (dword) donc vaut mieux mettre les Long d'abord, les Integer groupés par 2 et les Bytes groupés par 4, mais ça n'a aucune importance parce que Vb se débrouille avec et c'est transparent pour l'utilisateur, ça prend plus de place c'est tout.

"les enregistrements sont totalement décalés"
ha bon !!!
la longueur d'un enregistrement est 7 dans ton cas, il faut lire et écrire avec la même longueur
si ça marche pour un, ça marche pour deux et pour n'importe quel nombre.

Private Type Ty_enreg_ext
    num_dico    As Byte
    num_mot_ext As Long
    nb_let_av   As Byte
    nb_let_ap   As Byte
End Type

Private Sub Command1_Click()
    Dim enreg_ext As Ty_enreg_ext
  
'   ECRITURE
    Open App.Path & "\Dico_ext_" & niv & ".txt" For Random As #1 Len = Len(enreg_ext)
  
'   1er enregistrement
    enreg_ext.num_dico = 11
    enreg_ext.num_mot_ext = 12
    enreg_ext.nb_let_av = 13
    enreg_ext.nb_let_ap = 14
    Put #1, 1, enreg_ext
   
'   2ème enregistrement
    enreg_ext.num_dico = 21
    enreg_ext.num_mot_ext = 22
    enreg_ext.nb_let_av = 23
    enreg_ext.nb_let_ap = 24
    Put #1, 2, enreg_ext
   
    Close #1
  
End Sub

Private Sub Command2_Click()
    Dim enreg_ext As Ty_enreg_ext

'   LECTURE
    Open App.Path & "\Dico_ext_" & niv & ".txt" For Random As #1 Len = Len(enreg_ext)
  
'   1er enregistrement
    Get #1, 1, enreg_ext
    MsgBox enreg_ext.num_dico
    MsgBox enreg_ext.num_mot_ext
    MsgBox enreg_ext.nb_let_av
    MsgBox enreg_ext.nb_let_ap
   
'   2ème enregistrement
    Get #1, 2, enreg_ext
    MsgBox enreg_ext.num_dico
    MsgBox enreg_ext.num_mot_ext
    MsgBox enreg_ext.nb_let_av
    MsgBox enreg_ext.nb_let_ap
   
    Close #1
 
End Sub

Daniel
3
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
11 avril 2007 à 19:17
Déjà c'est pas du VB.NET !

Redman
0
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 1
11 avril 2007 à 22:36
j'ai jamais dit que c'était du vbnet
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
OneHacker Messages postés 1447 Date d'inscription jeudi 2 novembre 2000 Statut Membre Dernière intervention 23 septembre 2007 2
11 avril 2007 à 22:38
Oops désolé je croyais que c'était dans la catégorie VB.NET.

Redman
0
cs_MPi Messages postés 3877 Date d'inscription mardi 19 mars 2002 Statut Membre Dernière intervention 17 août 2018 23
12 avril 2007 à 00:01
Tu écris ceci
Open App.Path & "\Dico_ext_" & niv & ".txt" For Random As #F2 Len = Len_ext

mais on voit pas ce que vaut Len_Ext
Est-ce une variable déclarée de type Ty_enreg_ext ?

MPi
0
cs_lermite222 Messages postés 492 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 2 juillet 2012 4
12 avril 2007 à 01:56
la différence entre Gobillo et Marco c'est que Gobillo déclare la variable qui va servir pour la longueur de l'ERG


    Dim enreg_ext As Ty_enreg_ext
   
'   ECRITURE
    Open App.Path & "\Dico_ext_" & niv & ".txt" For Random As #1 Len = Len(enreg_ext)


Quand tu saisi un ERG il a toujours la longueur déclarée dans len=XX
ainsi ERG 1 aura 1 à XX octets
   ERG2 aura XX+1 to XX*2
etc..
cordialement
louis
0
cs_lermite222 Messages postés 492 Date d'inscription jeudi 5 avril 2007 Statut Membre Dernière intervention 2 juillet 2012 4
12 avril 2007 à 02:13
de plus, en relisant ton code je remarque que tu déclare des variables byte or cette déclaration ne convient pas pour l'emploi que tu veux en faire.
Byte=Types de données SQL du moteur de base de données Microsoft Jet
En VB6 ou VBA les déclarations devraient être Integer pour un double byte ou
une variable Boolean si tu n'a besoin que d'un signe (drapeau) , cette variable travail uniquement sur le signe du bit, le bit est négatif (-) =true, le bit =0  =false
Attention dans le code, certain retour envoie <vrai> et si tu compare à true celà fait une erreur
il vaut mieux, pour la tester faire 
   if VariableBoolean then   'rem quel soit à true ou a vrai ca marche
      exécution
   end if
cordialement 
louis


 
0
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 1
12 avril 2007 à 19:21
bonjour à tous
merci "Gobillot" tu m'as bien aidé, en fait j'avais créer mes fichiers avec "output" , ce qui me donnait un fichier texte parfaitement lisible (avec notepad) (ce qui n'était pas mon but , mais je croyais les fichiers parfaits) tandis qu'avec "random" le fichier n'est plus lisible de la même manière, tous les chiffres sont des hiéroglyphes, et tout se trouve sur une même ligne. mais qu'à ça ne tienne c'est parfait. Dans l'aide de MSDN "Les données lues avec l'instruction Get sont généralement placées dans un fichier à l'aide de l'instruction Put" "généralement" je pensais donc qu'on pouvait aussi créer le fichier avec un autre mode.
autre petit point comment tu as trouvé  :
" MsgBox LenB(enreg1_ext)   '12 = 1 + 3 + 4 + 1 + 1 + 2     (perte de 5)
  MsgBox LenB(enreg2_ext)   '  8 = 4 + 1 + 1 + 1 + 1            (perte de 1)"

à MPI: j'avais dans une autre partie du programe déclaré : "Dim enreg_ext As Ty_enreg_ext"

à Lermite je n'ai pas bien compris :
"Quand tu saisi un ERG il a toujours la longueur déclarée dans len=XX
ainsi ERG 1 aura 1 à XX octets
   ERG2 aura XX+1 to XX*2  "

et pour la déclaration j'ai toujours vu Byte= 1 octet Integer=2 octets ... et ceci dans VB6, !?????
0
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 1
12 avril 2007 à 20:01
rebonsoir à tous
je viens d'enlever "réponse acceptée" car je m'étais trop vite réjouis en fait j'ai fait un test en lecture de mes fichiers créer mais tant que j'étais au premier enregistrement aucun problème mais les enregistrement sont totalement décalés, on dirait que le format n'est de enreg_ext n'est pas pris en compte!!! qu'est ce que j'ai encore oublié????????
0
cs_marco62118 Messages postés 176 Date d'inscription mercredi 7 avril 2004 Statut Membre Dernière intervention 1 avril 2013 1
12 avril 2007 à 23:22
Bonsoir Daniel
vraiment sympa de répondre comme ça!!!

Je viens de trouver mon erreur pour la longueur de l'enregistrement len_ext j'avais écrit "len_ext = lenB(enreg_ext) , comme l'exemple dans MSDN "Utilisation de l'accès aléatoire aux fichiers" . et pour la lecture j'avais repris ton écriture len(enreg_ext), j'avais donc mélangé les deux méthodes de longueur de l'enregistrement.
Il apparait qu'avec len l'enregistrement est plus court, que vaut il mieux utiliser?

en tous cas encore merci
0
Gobillot Messages postés 3140 Date d'inscription vendredi 14 mai 2004 Statut Membre Dernière intervention 11 mars 2019 34
12 avril 2007 à 23:51
Bonsoir,
je suis très heureux que tu as enfin résolu ton problème
j'ai toujours utilisé Len (en fait j'utilise une constante Len = 7 mais faut pas le dire)
curieux que MSDN propose LenB

voilà ce qui se passe avec LenB
   premier enregistrement:
       Longueur = 7  --> ok
   deuxième enregistrement:
       Longueur = 19 --> bizarre ???

ben non c'est normal, le deuxième commence à Len+1 donc à 12
on retrouve bien les 5 caractères de perdus, ils sont mis à la fin à cause du calcul (numéro - 1) * Len + 1
c'est les fameux caractères de cadrage, filler ou dummy, qui servent à rien
il faut donc utiliser Len, sinon le fichier risque de devenir plus gros inutilement.

Daniel
0
Rejoignez-nous