sauvegarder un Dim(x)

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

sauvegarder un Dim(x)

Message 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 ??
Anonyme2
Messages : 3518
Inscription : jeu. 22/janv./2004 14:31
Localisation : Sourans

Message 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
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

Message 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  
kelly
Messages : 176
Inscription : jeu. 09/sept./2004 16:15

Message 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 :P
comtois
Messages : 5186
Inscription : mer. 21/janv./2004 17:48
Contact :

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

Message 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
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message 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 ? 8O
Avatar de l’utilisateur
Kwai chang caine
Messages : 6989
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Message par Kwai chang caine »

bah, tu as raison..... :oops:

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 ... :roll:

Bon c'est pas grave je te remercie de ta reponse DOBRO
Répondre