cs_plastik
Messages postés16Date d'inscriptionsamedi 1 février 2003StatutMembreDernière intervention 4 juin 2012
-
23 juin 2010 à 13:15
cs_plastik
Messages postés16Date d'inscriptionsamedi 1 février 2003StatutMembreDerniè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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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
cs_Jack
Messages postés14006Date d'inscriptionsamedi 29 décembre 2001StatutModérateurDernière intervention28 août 201579 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
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)
cs_plastik
Messages postés16Date d'inscriptionsamedi 1 février 2003StatutMembreDerniè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?