Page 1 sur 1
sauvegarder un Dim(x)
Publié : mer. 20/juil./2005 12:55
par kelly
A un certain moment, je souhaiterais sauvegarder sur diskdur le contenu de tout mon tableau Dim. Mais est-ce possible ??
Quel serait le code pour une sauvegarde automatique avec un nom predefini et le code pour un chargement de la bank sauvé la veille ??
Publié : mer. 20/juil./2005 13:44
par Anonyme2
Ca donne quelque chose comme ça mais le mode d'enregistrement (WriteLong() ou de lecture ReadLong() dépend du type de données)
Code : Tout sélectionner
; sauvegarde du tableau
; d'abord mettre le nombre d'éléments du tableau à sauvegarder
; ça permet de pouvoir sauvegarder des tableaux de tailles différentes
#Nb_Element = 10
Dim a.l(#Nb_Element) ; de 0 à 10 soit 11 éléments
Dim b.l(#Nb_Element) ; pour la lecture
Procedure sauvegarde(Index)
; index est le nombre d'éléments du tableau
If Index >= 0 And CreateFile(0, "C:\Montableau.bin") ; fichier à créer
WriteLong(Index) ; on écrit la taille du tableau
For i = 0 To Index
WriteLong(a(i))
Next i
CloseFile(0)
EndIf
EndProcedure
Procedure Lecturefichier()
If ReadFile(0, "C:\Montableau.bin") ; fichier à lire
; index est le nombre d'éléments du tableau
Index = ReadLong()
If index >= 0
For i = 0 To Index
b(i) = ReadLong()
Next i
EndIf
CloseFile(0)
EndIf
EndProcedure
If OpenWindow(0, 0, 0, 400, 300, #PB_Window_SystemMenu|#PB_Window_ScreenCentered, "")
If CreateGadgetList(WindowID()) And ListIconGadget(0, 20, 20, 360, 150, "Tableau origine", 170, #PB_ListIcon_GridLines)
AddGadgetColumn(0, 1, "Tableau lu", 169)
; on rempli le 1er tableau
For i = 0 To #Nb_Element
a(i) = 2 * i
Next i
; on sauvegarde le 1er tableau
sauvegarde(#Nb_Element)
; on lit le fichier dans le 2eme tableau
Lecturefichier()
; on affiche "
For i = 0 To #Nb_Element
AddGadgetItem(0, i, Str(a(i))+Chr(10)+Str(b(i)))
Next i
Repeat
If WaitWindowEvent() = #PB_EventCloseWindow
Break
EndIf
ForEver
EndIf
EndIf
Publié : mer. 20/juil./2005 17:48
par comtois
ou avec writedata et readdata si c'est pas des chaines , sinon faut faire comme Denis propose .
Code : Tout sélectionner
#NbElement=10
Dim Tab(#NbElement)
;Remplissage du tableau
For i=0 To #NbElement
Tab(i)=1+i
Next i
;Enregistre
If CreateFile(0,"C:\toto.txt")
WriteData(Tab(),(#NbElement+1)*SizeOf(LONG))
CloseFile(0)
EndIf
;Tableau pour tester la lecture
Dim TabTest(#NbElement)
If OpenFile(0,"C:\toto.txt")
ReadData(TabTest(),(#NbElement+1)*SizeOf(LONG))
CloseFile(0)
EndIf
;Affiche le résultat
For i=0 To #NbElement
Debug TabTest(i)
Next i
Publié : ven. 22/juil./2005 2:16
par kelly
@comtois :
Ce ne sont pas des chaines, mon dim a sauvegarder est en .b uniquement.
Et comtois, tu me croiras si tu veux mais apparement, ta routine ne sauvegarde pas fidelement les bits de chaque bytes. Un Dim.b, le "*SizeOf(LONG)" est bien egal a "*1" ?
@denis :
J'ai adapté ta source a des byte et la, ca marche. Tous les bits semblent fidelement reproduit

Publié : ven. 22/juil./2005 11:21
par comtois
voila une version avec des bytes
Code : Tout sélectionner
#NbElement=10
Dim Tab.b(#NbElement)
;Remplissage du tableau
For i=0 To #NbElement
Tab(i)=1+i
Next i
;Enregistre
If CreateFile(0,"C:\toto.txt")
WriteData(Tab(),(#NbElement+1)*SizeOf(BYTE))
CloseFile(0)
EndIf
;Tableau pour tester la lecture
Dim TabTest.b(#NbElement)
If OpenFile(0,"C:\toto.txt")
ReadData(TabTest(),(#NbElement+1)*SizeOf(BYTE))
CloseFile(0)
EndIf
;Affiche le résultat
For i=0 To #NbElement
Debug TabTest(i)
Next i
en fait
SizeOf(BYTE) renvoie le nombre d'octets
Donc pour Byte c'est 1
et pour Long c'est 4 .
J'aurais pu effectivement mettre directement le nombre d'octets.
Mais c'était surtout pour te montrer que si tu avais un tableau basé sur une structure sans chaine de caractères ,ça marche aussi .
Code : Tout sélectionner
Structure Toto
lig.l
Col.l
truc.b
bidule.f
EndStructure
#NbElement=10
Dim Tab.Toto(#NbElement)
;Remplissage du tableau
For i=0 To #NbElement
Tab(i)\truc=1+i
Next i
;Enregistre
If CreateFile(0,"C:\toto.txt")
WriteData(Tab(),(#NbElement+1)*SizeOf(Toto))
CloseFile(0)
EndIf
;Tableau pour tester la lecture
Dim TabTest.Toto(#NbElement)
If OpenFile(0,"C:\toto.txt")
ReadData(TabTest(),(#NbElement+1)*SizeOf(Toto))
CloseFile(0)
EndIf
;Affiche le résultat
For i=0 To #NbElement
Debug TabTest(i)\truc
Next i
Publié : jeu. 12/avr./2007 10:27
par Kwai chang caine
Bonjour
comtois a écrit :ou avec writedata et readdata si c'est pas des chaines , sinon faut faire comme Denis propose .
Le tableau que je veux sauvegarder est avec des chaines, j'ai éssayé avec le code de DENIS, comme l'a conseillé comtois, mais il ne concerne que des tableau a chiffre.
Comment le modifier pour que ça marche avec les chaines
merci
Publié : jeu. 12/avr./2007 11:36
par Backup
Kwai chang caine a écrit :Bonjour
comtois a écrit :ou avec writedata et readdata si c'est pas des chaines , sinon faut faire comme Denis propose .
Le tableau que je veux sauvegarder est avec des chaines, j'ai éssayé avec le code de DENIS, comme l'a conseillé comtois, mais il ne concerne que des tableau a chiffre.
Comment le modifier pour que ça marche avec les chaines
merci
ben a la place de "WriteLong" tu mets "WriteString"... enfin ça me parait logique non ?

Publié : jeu. 12/avr./2007 12:38
par Kwai chang caine
bah, tu as raison.....
En fait, a force d'essayer et de lire plein de code, j'ai pas fait attention que ce code ne faisait que lire une à une les données du tableau pour les ecrire dans un fichier et inversement.
Je cherchais quelque chose de plus direct, un peu du meme principe que celui de comtois, une super combine comme vous savez bien faire, avec les acces a la memoire, pointeur, etc ...
Bon c'est pas grave je te remercie de ta reponse DOBRO