Erreur trop chiante en écrivant dans un fichier

Erreur trop chiante en écrivant dans un fichier - VB/VBA/VBS - Programmation

Marsh Posté le 11-06-2004 à 14:32:02    

salut tous le monde ! c'est pour un petit renseignement :
 
Mon soft sera cencé découper un fichier pour ouvrir dans un RichTextBox les données qui concerne l'utilisateur selectionné (toutes les données des utilisateurs sont dans le meme fichier, d'ou la découpe) mais j'arrive plus a intégrer mon RTB dans le fichier a cause de cette erreur : "Longueur d'enregistrement incorecte". :(  
 
'Un bout de mon code en simplifié

Code :
  1. Open "fichier" for random as #1
  2. 'je ne précise pas Len car les enregistrements sont de longeur variable
  3. Do While not MonArray(MaVar)="[Fin]"
  4. Put #1, , MonArray(MaVar)
  5. MaVar = MaVar +1
  6. Loop
  7. Close #1


 
ça marchait bien, j'arrivais meme a enregistrer des images (bon, le fichier etait lourd mais ça marchait!) et lors d'une tentative de sauvegarde, l'erreur inatendu arriva )"Longueur d'enregistrement incorecte" ):fou:  
 
ça me rend fou cette histoire de sauvegarde :pt1cable:  
j'ai éssayer tous les modes Open, y'a toujours un truc qui fout la merde, parceque les lignes sont crypté!
 
Merci de repondre si vous avez une idées, meme une toute petite idée.
 :jap:

Reply

Marsh Posté le 11-06-2004 à 14:32:02   

Reply

Marsh Posté le 11-06-2004 à 14:43:59    

T'en as souvent des erreurs pas chiantes parce que là, je suis preneur :lol:  


---------------
J'ai un message.."Cliquez OK pour continuer."...Qu'est ce que je fais ?
Reply

Marsh Posté le 11-06-2004 à 14:48:20    

J'appelle une erreur pas chiante celles qui sont facile a resoudre, ça fait 2 semaines que je tente par tous les moyens de réparer ce problème mais j'y arrive pas ! :cry:  
 
crois-tu pouvoir m'aider ?

Reply

Marsh Posté le 11-06-2004 à 15:02:47    

Si les lignes sont crytées, t'as peut-être un caractère type EOF dans le milieu qui arrête la lecture.


---------------
J'ai un message.."Cliquez OK pour continuer."...Qu'est ce que je fais ?
Reply

Marsh Posté le 11-06-2004 à 15:25:40    

Justement, avec les autres mode open, ça ne marchait pas parceque il y avait soit un caractère type saut de ligne, donc avec line Input ça ne prenait qu'une partis de la chaine donc ça renvoyait n'importe quoi au décryptage et ça plantait soit un carac EOF, meme consequence.
Mais avec le mode random, il enregistre chaque ligne comme une occurence donc pas de probleme de cryptage mais le fichier est plus lourd (encore ça c'est pas trop grave), ce qui est chiant c'est le bug de "longueur d'enregistrement incorrect"! lors de la sauvegarde (ecrit avec Put #1,, MonArray(myVar))  
 
y aurait-il une longeur d'enregistrement limité ? :??:

Reply

Marsh Posté le 11-06-2004 à 15:41:26    

Affiche la longueur de MonArray(MaVar) avant d'écrire.


---------------
J'ai un message.."Cliquez OK pour continuer."...Qu'est ce que je fais ?
Reply

Marsh Posté le 11-06-2004 à 15:47:23    

Open "fichier" for random as #1 Len = Len(MonArray(MyVar))
 
Comme ça quoi ?

Reply

Marsh Posté le 11-06-2004 à 16:12:06    

Je voulais dire:
debug.print len(MonArray(MaVar))
debug.print MonArray(MaVar)
pour voir sur quelle ligne ça coince, et sa longueur.


Message édité par JihemAir le 11-06-2004 à 16:13:09

---------------
J'ai un message.."Cliquez OK pour continuer."...Qu'est ce que je fais ?
Reply

Marsh Posté le 11-06-2004 à 16:50:15    

la je suis pas chez moi je suis en stage (de compta), je fini à 18h,je regarderais ça et je te dirais.
 
je te remercie d'essayer de m'aider, c'est sympa. :)

Reply

Marsh Posté le 11-06-2004 à 20:03:20    

JihemAir a écrit :

debug.print len(MonArray(MaVar))
debug.print MonArray(MaVar)


 
 177  
!Ðß}™¯>Ƚ)?½Ó·u?=uhb/_8†½OèÆ(Þ8ãH‘)2+n­Õpée– áœÌ–"&²öé0_IèÒ½‡š{Øã[ û.•‹¼YЕI”.ÈSÏ·‡‚qʛV+2  ¢I¥ƒ3—Ýo³öÏØF0Š¶/þÞ5y ¨O¶Ê‹¦Ü…AÿIazŒ‰?S”UÅc؄2œ^_á(ÊZZÓ>¢,‰eà˜eçH
 
voila, c'est la ou ça plante ! :(  
 
sinon voila la total du code des procedures de lecture et de sauvegarde (+ 2 ou trois autres trucs) de mon module.
 
y'a une parti de la lecture qui se fait en amont dans la form qui se lance en premier
 
En fait la sub LoadForm charge juste dans la RTB les infos de l'utilisateur sauf si criteria = faux.
 
L'erreur arrive la ou il y a les Debug.Print
 
bon j'espère que tu auras le courage de le lire.
si d'autres repèrent des anomalies, qu'ils n'hésite pas non plus de me prévenir.
 

Code :
  1. Public Const PassCrypt As String = "InfosPassProtect"
  2. Public Const PassTwo As String = "SC963."
  3. Public Type Record
  4.     Name As String
  5. End Type
  6. Public a As Record
  7. Public OpenAccess As String
  8. Public NbLineFile As Long
  9. Public NumUsers As Long
  10. Public CPRESS As CPRESSDLL
  11. Public CRYPTE As CRYPTEURDLL
  12. Public Type USER
  13.     NumCpte As Long
  14.     PassWord As String
  15.     NomCpte As String
  16.     TypeCpte As Byte
  17. '    AcceCpte As Long
  18.     Particularity  As String
  19. End Type
  20. Public ADDUSER As USER
  21. Public Utilisateur() As USER
  22. Public USERCOUNT As Long
  23. Public USERACTIF As USER
  24.    
  25. Public List1() As String
  26. Public List2() As String
  27. Public List3() As String
  28. Public IsCreate As Boolean
  29. Public USERCREATE As USER
  30. Public IsSuppr As Boolean
  31. Public USERSUPPR As USER
  32. Private MaxLenCarac As Integer
  33.    
  34. Public Function AskPass(ByVal PassWord As String) As Boolean
  35. If PassWord = USERACTIF.PassWord Then AskPass = True
  36. End Function
  37. Public Function EtatCmdAction(ByVal Action As String) As String
  38. Select Case Action
  39.     Case "Open"
  40.     EtatCmdAction = "Ouvrir un compte"
  41. End Select
  42. End Function
  43. Public Sub LoadForm(ByVal Criteria As Boolean)
  44. ReDim List1(0)
  45. ReDim List2(0)
  46. ReDim List3(0)
  47. If Criteria = True Then
  48. A03Infos.Show
  49. End If
  50. Set CPRESS = New CPRESSDLL
  51. Set CRYPTE = New CRYPTEURDLL
  52. ReDim List1(0)
  53. A03Infos.Caption = "in - " & USERACTIF.NomCpte
  54. Open OpenAccess & "AlfaZZn.ced" For Random As #1
  55. Dim i1&
  56. '1111111111111111111111111111111111111111111111111111111111111111111111111
  57. Do While Not a.Name = "[User]"
  58. Get #1, , a.Name
  59.     i1 = i1 + 1
  60.     ReDim Preserve List1(i1)
  61.     List1(i1) = a.Name
  62.     Call Maximum(List1(i1))
  63.     Call addPG
  64. a.Name = CRYPTE.RC4(a.Name, PassCrypt)
  65. Loop
  66. Do While Not a.Name = "[Fin]"
  67. Get #1, , a.Name
  68.     i1 = i1 + 1
  69.     ReDim Preserve List1(i1)
  70.     List1(i1) = a.Name
  71.     Call Maximum(List1(i1))
  72.     Call addPG
  73. a.Name = CRYPTE.RC4(a.Name, PassCrypt)
  74. Loop
  75. '1111111111111111111111111111111111111111111111111111111111111111111111111
  76. '2222222222222222222222222222222222222222222222222222222222222222222222222
  77. 'Recherche du compte de l'utilisateur actif
  78. Do While Not ChargeList(Criteria, a.Name) = True
  79. Get #1, , a.Name
  80.     i1 = i1 + 1
  81.     ReDim Preserve List1(i1)
  82.     List1(i1) = a.Name
  83.     Call Maximum(List1(i1))
  84.     Call addPG
  85. a.Name = CRYPTE.RC4(a.Name, PassCrypt)
  86. Loop
  87. If Criteria = True Then
  88. Else
  89. Close #1
  90. Exit Sub
  91. End If
  92. '2222222222222222222222222222222222222222222222222222222222222222222222222
  93. Dim i2&
  94.     Open OpenAccess & "C###U#" & USERACTIF.NomCpte & USERACTIF.NumCpte & ".tmp" For Output As #2
  95.     ReDim List2(0)
  96.    
  97.     Do While Not a1 = "[Fin]"
  98.         Get #1, , a.Name
  99.         a1 = CRYPTE.RC4(a.Name, PassCrypt)
  100.        
  101.                     If a1 = "[Fin]" Then Exit Do
  102.                 i2 = i2 + 1
  103.                 ReDim Preserve List2(i2)
  104.                 List2(i2) = a.Name
  105.                 Call addPG
  106.         a2 = CRYPTE.RC4(a.Name, USERACTIF.PassWord & PassTwo)
  107.    
  108.         DoEvents
  109.         Print #2, a2
  110.     Loop
  111.     Len2 = i2
  112.    
  113.     Close #2
  114.     A03Infos.RTBox1.LoadFile (OpenAccess & "C###U#" & USERACTIF.NomCpte & USERACTIF.NumCpte & ".tmp" )
  115.     Kill OpenAccess & "C###U#" & USERACTIF.NomCpte & USERACTIF.NumCpte & ".tmp"
  116.    
  117. Dim i3&
  118. i3 = 1
  119. ReDim List3(i3)
  120. List3(i3) = a.Name
  121. Call Maximum(List3(i3))
  122. Do While Not Loc(1) + 1 = Seek(1) 'A revoir
  123. Get #1, , a.Name
  124.     i3 = i3 + 1
  125.     ReDim Preserve List3(i3)
  126.     List3(i3) = a.Name
  127.     Call Maximum(List3(i3))
  128.     Call addPG
  129. Loop
  130. Len3 = i3
  131. Close #1
  132. End Sub
  133. Private Function ChargeList(ByVal Criteria As Boolean, MyString As String) As Boolean
  134. If Criteria = True Then
  135. If MyString = "[" & USERACTIF.NumCpte & "]" Then ChargeList = True
  136. Else
  137. If EOF(1) = True Then ChargeList = True
  138. End If
  139. End Function
  140. Public Sub SavInFile()
  141. Set CPRESS = New CPRESSDLL
  142. Set CRYPTE = New CRYPTEURDLL
  143. A03Infos.RTBox1.SaveFile (OpenAccess & "C###U#" & USERACTIF.NomCpte & USERACTIF.NumCpte & ".tmp" )
  144. Dim i2&
  145.     Open OpenAccess & "C###U#" & USERACTIF.NomCpte & USERACTIF.NumCpte & ".tmp" For Input As #2
  146.     ReDim List2(0)
  147.    
  148.     Do While Not EOF(2)
  149.         Line Input #2, a.Name
  150.         i2 = i2 + 1
  151.         ReDim Preserve List2(i2)
  152.         List2(i2) = CRYPTE.RC4(a.Name, USERACTIF.PassWord & PassTwo)
  153.         Call Maximum(List2(i2))
  154.         Call addPG
  155.     Loop
  156.    
  157.    
  158.     Close #2
  159.     Kill OpenAccess & "C###U#" & USERACTIF.NomCpte & USERACTIF.NumCpte & ".tmp"
  160. Open OpenAccess & "AlfaZZn.ced" For Output As #1
  161. 'Vide le fichier
  162. Close #1
  163. Dim MyChaine As String
  164. Open OpenAccess & "AlfaZZn.ced" For Random As #1 'Len = MaxLenCarac + 2
  165. Dim i1&
  166. Put #1, , CRYPTE.RC4("[NbLine]", PassCrypt)
  167. Put #1, , CRYPTE.RC4(UBound(List1, 1) + UBound(List2, 1) + UBound(List3, 1), PassCrypt)
  168. Put #1, , CRYPTE.RC4("[NumUsers]", PassCrypt)
  169. Put #1, , CRYPTE.RC4(NumUsers, PassCrypt)
  170. Dim UserFind As Boolean
  171. Dim UserFind2 As Boolean
  172. i1 = 5
  173. For i1 = 5 To UBound(List1, 1)
  174.     If IsSuppr = True Then
  175.         If List1(i1) = CRYPTE.RC4("[User]", PassCrypt) Then
  176.             UserFind = True
  177.         End If
  178.        
  179.         If List1(i1) = CRYPTE.RC4(USERSUPPR.NumCpte, PassCrypt) And UserFind = True Then
  180.             If List1(i1 + 1) = CRYPTE.RC4(USERSUPPR.NomCpte, PassCrypt) Then
  181.                 If List1(i1 + 2) = CRYPTE.RC4(USERSUPPR.PassWord, PassTwo) Then 'a change en
  182.                    i1 = i1 + 5
  183.                    UserFind2 = True
  184.                 End If
  185.             End If
  186.         End If
  187.        
  188.         If List1(i1) = CRYPTE.RC4("[" & USERSUPPR.NumCpte & "]", PassCrypt) And UserFind2 = True Then
  189.             Do While Not List1(i1) = CRYPTE.RC4("[Fin]", PassCrypt)
  190.             i1 = i1 + 1
  191.             Loop
  192.             i1 = i1 + 1
  193.             IsSuppr = False
  194.             UserFind2 = False
  195.         End If
  196.         y = LOF(1)
  197.             If i1 >= UBound(List1, 1) Then Exit For
  198.         If List1(i1) = CRYPTE.RC4("[Fin]", PassCrypt) And UserFind = True Then
  199.         UserFind = False
  200.         End If
  201.        
  202.     End If
  203.     If IsCreate = True Then
  204.         If List1(i1) = CRYPTE.RC4("[User]", PassCrypt) Then
  205.             UserFind = True
  206.         End If
  207.        
  208.         If List1(i1) = CRYPTE.RC4("[Fin]", PassCrypt) And UserFind = True Then
  209.             Put #1, , CRYPTE.RC4(USERCREATE.NumCpte, PassCrypt)
  210.             Put #1, , CRYPTE.RC4(USERCREATE.NomCpte, PassCrypt)
  211.             Put #1, , CRYPTE.RC4(USERCREATE.PassWord, PassTwo)
  212.             Put #1, , CRYPTE.RC4(USERCREATE.TypeCpte, PassCrypt)
  213. '           Put #1, , CRYPTE.RC4(USERCREATE.AcceCpte, PassCrypt)
  214.             Put #1, , CRYPTE.RC4(USERCREATE.Particularity, PassCrypt)
  215.             UserFind = False
  216.         End If
  217.     End If
  218.  
  219. Put #1, , List1(i1)
  220. '    p = Loc(1)
  221. Next
  222. i2 = 0
  223. For i2 = 1 To UBound(List2, 1)
  224. Debug.Print Len(List2(i2))
  225. Debug.Print List2(i2)
  226. Put #1, , List2(i2)
  227. '    p = Loc(1)
  228. Next
  229. Dim i3&
  230. i3 = 0
  231. For i3 = 1 To UBound(List3, 1)
  232. MyChaine = List3(i3)
  233. Put #1, , List3(i3)
  234. '    p = Loc(1)
  235. Next
  236.     If IsCreate = True Then
  237.         Put #1, , CRYPTE.RC4("[" & USERCREATE.NumCpte & "]", PassCrypt)
  238.         Put #1, , CRYPTE.RC4("[Fin]", PassCrypt)
  239.     IsCreate = False
  240.     End If
  241. Close #1
  242. End Sub
  243. Public Sub KillCpte()
  244. IsSuppr = True
  245. End Sub
  246. Public Sub addPG()
  247. End Sub
  248. Public Sub Maximum(ByVal ListTruc As String)
  249. If Len(ListTruc) > MaxLenCarac Then MaxLenCarac = Len(ListTruc)
  250. End Sub


 
PS: La Sub Maximum ne sert plus.

Reply

Marsh Posté le 11-06-2004 à 20:03:20   

Reply

Marsh Posté le 13-06-2004 à 19:03:48    

T'as essayé d'utiliser le mode binaire ?
Pasque le mode random à la base il est utile si tu connais la longueur des enregistrements :o


Message édité par glod 2 le 13-06-2004 à 19:04:10
Reply

Marsh Posté le 14-06-2004 à 13:27:36    

Ouai, avec le mode binaire ça ne marchai pas non plus, l'erreur arrivai a un aute endroit mais y'avait donc toujours une erreur.
 
j'ai trouvé une solution, je calcul l'enregistrement le plus long avec ma fonction Maximum et je m'en sert comme ça :
  Open "fichier" for random as #1 Len = Len(MaxLenCarac)
Cette solution ne me plait pas trop quand meme parcequ'il faut enregistrer MaxLenCarac dns un autre fichier pour l'utiliser dans l'avenir.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed