Problème avec PUT

Résolu
cs_plastik Messages postés 16 Date d'inscription samedi 1 février 2003 Statut Membre Dernière intervention 4 juin 2012 - 23 juin 2010 à 13:15
cs_plastik Messages postés 16 Date d'inscription samedi 1 février 2003 Statut Membre Dernière intervention 4 juin 2012 - 24 juin 2010 à 13:06
Bonjour à tous,
j'ai un soucis avec la fonction put.
J'ai écris un petit code qui me permet d'extraire le nom d'un fichier se trouvant dans une liste dans un texte.
Ensuite le code va ouvrir un fichier en mode binary dans lequel se trouve une autre liste de fichier avec leur taille et position dans l'image ISO de laquelle ils proviennent.
Mon problème: je souhaite modifier dans le fichier ouvert en mode binaire la position dans laquelle se trouve chaque fichier. Pour cela j'extrais la position de l'autre fichier texte. Tout fonctionne nickel mais lorsque je veut écrire la position du fichier avec la commande PUT il m'écris d'autre valeur avant d'écrire ma position.
Voilà le code:
Dim caca As String, ligne As String, fich As String, nblig As Integer, i As Integer, j As Integer
Open "c:\FILEINFO.DAT" For Binary As #1
Open "c:\j.txt" For Input As #2
nblig = 0
Seek #1, 2385
Start:
For k = 1 To 20
  caca = Input(1, #1)
  If caca = "." Then
    Seek #1, Seek(1) - k
    For l = 1 To k + 3
      fichier = fichier & Input(1, #1)
    Next l
    GoTo comptage
  End If
Next k
'à partir de là on a lu le nom du fichier dans FILEINFO.BIN
comptage:
nblig = nblig + 1
Line Input #2, ligne
For i = 1 To Len(ligne)
  If Mid(ligne, i, 1) = "." Then
    For j = 1 To i
      If Mid(ligne, i - j, 1) = "" Then
        fich = Mid(ligne, i - j + 1)
        GoTo compare
      End If
    Next j
  End If
Next i
compare:
If fich fichier Then ee Hex(Mid(ligne, 1, 7)) Else: GoTo comptage
For m = 1 To 20
  If Not Hex(Asc(Input(1, #1))) = "0" Then GoTo continue
Next m
continue:
Seek #1, Seek(1) + 3
  ee = Hex(Mid(ligne, 1, 7))
  hh = Len(ee) / 2
  For g = 1 To hh
    ii = ii + 2
    oo = Len(ee) - ii
    ff = ff & Mid(ee, oo + 1, 2)
  Next g
  If Len(ff) 2 Then ff ff & "000000"
  If Len(ff) 4 Then ff ff & "0000"
  If Len(ff) 6 Then ff ff & "00"
  If Len(ff) 8 Then ff ff
  pos1 = Mid(ff, 1, 2)
  pos2 = Mid(ff, 3, 2)
  pos3 = Mid(ff, 5, 2)
  pos4 = Mid(ff, 7, 2)
  If pos1 "00" Then pos1 "0"
  If pos2 "00" Then pos2 "0"
  If pos3 "00" Then pos3 "0"
  If pos4 "00" Then pos4 "0"
  pos1 = Chr(CLng("&H" & pos1))
  pos2 = Chr(CLng("&H" & pos2))
  pos3 = Chr(CLng("&H" & pos3))
  pos4 = Chr(CLng("&H" & pos4))
  Put #1, 2401, pos1
  Put #1, 2402, pos2
  Put #1, 2403, pos3
  Put #1, 2404, pos4
  msg = "C'est fait"
    Style = vbOKOnly + vbInformation
    Title = "Résultat de la lecture"
    response = MsgBox(msg, Style, Title)
    Close #1
    Close #2


Merci pour votre aide.

4 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
24 juin 2010 à 10:17
Ok
Alors c'est une question de dimensionnement de variable :
Quand tu fais un Put, tu définis ensuite la position et la variable que tu souhaite écrire.
Or, Put ne connait pas la longueur des données à écrire, il se base donc sur le type de cette variable.
Dans ton cas, Pos1 n'est pas dimensionné, donc est de type Variant, c'est à dire qu'il prendra comme taille : 22 octets + longueur de la chaine.
Pas bon pour écrire un simple octet/byte

Il te faut donc dimensionner finement tes variables :
Dim bytPos1 As Byte
Dim bytPos2 As Byte
Dim bytPos3 As Byte
Dim bytPos4 As Byte

pos1 = Mid(ff, 1, 2)
pos2 = Mid(ff, 3, 2)
pos3 = Mid(ff, 5, 2)
pos4 = Mid(ff, 7, 2)
[del]If pos1 = "00" Then pos1 = "0"
If pos2 "00" Then pos2 "0"
If pos3 "00" Then pos3 "0"
If pos4 "00" Then pos4 "0"
pos1 = Chr(CLng("&H" & pos1))
pos2 = Chr(CLng("&H" & pos2))
pos3 = Chr(CLng("&H" & pos3))
pos4 = Chr(CLng("&H" & pos4))/del
bytPos1 = CByte(Val("&h" & pos1))
bytPos2 = CByte(Val("&h" & pos2))
bytPos3 = CByte(Val("&h" & pos3))
bytPos4 = CByte(Val("&h" & pos4))
Put #1, 2401, bytPos1
Put #1, 2402, bytPos2
Put #1, 2403, bytPos3
Put #1, 2404, bytPos4

De cette manière, Put n'écrira qu'un Byte, c'est à dire un Octet
3
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
23 juin 2010 à 14:05
Salut
On sent que tu as fait du QBasic avant de t'attaquer à VB6 ...

- La lecture dans un fichier Binary se fait avec Get (Input uilisé comme cela est obsolète, mais fonctionne toujours)

- Il faut proscrire les Goto : mieux vaut créer des Sub ou Function
For m =   1 To 20
  If Not Hex(Asc(Input(1, #1))) = "0" Then GoTo continue
Next m
continue:
serait plus propre :
For m = 1 To 20
  If Not Hex(Asc(Input(1, #1))) = "0" Then Exit For
Next m
Sortir d'une boucle avec un Goto peut créer des surprises puisque VB pensera qu'elle n'est pas terminée (empilement)

- Fonctions Instr et InstrRev :
Line Input #2, ligne
For i  = 1 To Len(ligne)
  If Mid(ligne, i, 1) =  "." Then
    For j = 1 To i
      If Mid(ligne, i - j, 1) = "" Then

        fich = Mid(ligne, i - j + 1)
        GoTo compare
      End If
    Next j
  End If
Next i
à remplacer avantageusement par
Line Input #2, ligne
PosPoint = InstrRev(Ligne, ".")
PosSlash = InstrRev(Ligne, "")
fich = Mid$(Ligne, PosSlash + 1, PosPoint - PosSlah)
si tu es sûr qu'il y aura toujours un point et un back-slash dans ta chaine

- Mise en forme de chaine
  If Len(ff)  2 Then ff  ff & "000000"
  If Len(ff) 4 Then ff ff & "0000"
  If Len(ff) 6 Then ff ff & "00"
  If Len(ff) 8 Then ff ff
plus court avec
  ff = Left$(ff & "000000000000", 8)

- Ne sert à rien
  If pos1  "00" Then pos1  "0"
  If pos2 "00" Then pos2 "0"
  If pos3 "00" Then pos3 "0"
  If pos4 "00" Then pos4 "0"
puisque derrière, tu fais un Chr et que le formatage de "&H0" donnera le même résultat que "&h00"

- Rappel :
VB6 ne peut pas accéder aux données d'un fichier qui égale ou dépasse 2Go car la limite est imposée par le type Long (équivalent à 2^31 – 1)

- Et enfin ton problème
" il m'écris d'autre valeur avant d'écrire ma position "
Quelle valeur écrit-il ?
Quelle valeur lui envoies-tu ?
Non, VB n'écrit pas de position

Pour déboguer, place le curseur sur ta ligne du Put et appuie sur F9.
Le programme s'arrêtera là au prochain passage.
Survole tes variables avec la souris pour afficher leur contenu et vérifie qu'il s'agit de la bonne valeur.
F8 pour avancer d'une seule ligne de code
F5 pour continuer normalement

Vala
Jack, =fr MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_plastik Messages postés 16 Date d'inscription samedi 1 février 2003 Statut Membre Dernière intervention 4 juin 2012
24 juin 2010 à 07:38
Super merci pour tes conseils! Effectivement j'ai toujours écrit mes programmes sous Qbasic ^^
J'ai fais comme tu m'as dit et ma variable que je souhaite écrire dans le fichier contient bien "8E".
ET cette valeur je souhaite l'écrire dans le fichier.
Quand je l'ouvre avec un éditeur hexadécimal je vois qu'il m'a écrit 08 00 01 00 8E alors que moi je ne veut écrire que "8E".
C'est vraiment bizarre.
As-tu une idée de pourquoi?
0
cs_plastik Messages postés 16 Date d'inscription samedi 1 février 2003 Statut Membre Dernière intervention 4 juin 2012
24 juin 2010 à 13:06
Super ça fonctionne !!!
Nickel, je te remercie.
0
Rejoignez-nous