sauvegarder un Dim(x)
sauvegarder un Dim(x)
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 ??
Quel serait le code pour une sauvegarde automatique avec un nom predefini et le code pour un chargement de la bank sauvé la veille ??
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
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
@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
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

voila une version avec des bytes
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
#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
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
- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
Bonjour
Comment le modifier pour que ça marche avec les chaines
merci
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.comtois a écrit :ou avec writedata et readdata si c'est pas des chaines , sinon faut faire comme Denis propose .
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 ?Kwai chang caine a écrit :Bonjour
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.comtois a écrit :ou avec writedata et readdata si c'est pas des chaines , sinon faut faire comme Denis propose .
Comment le modifier pour que ça marche avec les chaines
merci

- Kwai chang caine
- Messages : 6989
- Inscription : sam. 23/sept./2006 18:32
- Localisation : Isere
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

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