Problème avec PUT [Résolu]

cs_plastik 16 Messages postés samedi 1 février 2003Date d'inscription 4 juin 2012 Dernière intervention - 23 juin 2010 à 13:15 - Dernière réponse : cs_plastik 16 Messages postés samedi 1 février 2003Date d'inscription 4 juin 2012 Dernière intervention
- 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.
Afficher la suite 

Votre réponse

4 réponses

Meilleure réponse
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 24 juin 2010 à 10:17
3
Merci
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

Merci cs_Jack 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 72 internautes ce mois-ci

Commenter la réponse de cs_Jack
cs_Jack 14010 Messages postés samedi 29 décembre 2001Date d'inscription 28 août 2015 Dernière intervention - 23 juin 2010 à 14:05
0
Merci
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)
Commenter la réponse de cs_Jack
cs_plastik 16 Messages postés samedi 1 février 2003Date d'inscription 4 juin 2012 Dernière intervention - 24 juin 2010 à 07:38
0
Merci
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?
Commenter la réponse de cs_plastik
cs_plastik 16 Messages postés samedi 1 février 2003Date d'inscription 4 juin 2012 Dernière intervention - 24 juin 2010 à 13:06
0
Merci
Super ça fonctionne !!!
Nickel, je te remercie.
Commenter la réponse de cs_plastik

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.