Lecture et écriture d'une chaine en binaire

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Lecture et écriture d'une chaine en binaire

Message par Guimauve »

Je viens de complèter deux petites commandes écrire une Structure de données contenant des Chaînes de caractère et des nombres flottant.

En espérant que ça puisse aider certaine personne.

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure >>>>>

Structure Ship
  
  Name.s
  Speed.f
  Size.f
  
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs >>>>>

Procedure SetShipName(*ObjetA.Ship, Name.s)
  
  *ObjetA\Name = Name
  
EndProcedure

Procedure SetShipSpeed(*ObjetA.Ship, Speed.f)
  
  *ObjetA\Speed = Speed
  
EndProcedure

Procedure SetShipSize(*ObjetA.Ship, Size.f)
  
  *ObjetA\Size = Size
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs >>>>>

Procedure.s GetShipName(*ObjetA.Ship)
  
  ProcedureReturn *ObjetA\Name
  
EndProcedure

Procedure.f GetShipSpeed(*ObjetA.Ship)
  
  ProcedureReturn *ObjetA\Speed
  
EndProcedure

Procedure.f GetShipSize(*ObjetA.Ship)
  
  ProcedureReturn *ObjetA\Size
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Update >>>>>

Procedure UpdateShip(*ObjetA.Ship, Name.s, Speed.f, Size.f)
  
  SetShipName(*ObjetA, Name)
  SetShipSpeed(*ObjetA, Speed)
  SetShipSize(*ObjetA, Size)
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Equal >>>>>

Procedure EqualShip(*ObjetA.Ship, *ObjetB.Ship)
  
  SetShipName(*ObjetA, GetShipName(*ObjetB))
  SetShipSpeed(*ObjetA, GetShipSpeed(*ObjetB))
  SetShipSize(*ObjetA, GetShipSize(*ObjetB))
  
EndProcedure


; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Procedure WriteBinaryString(String$)
  
  WriteLong(Len(String$)) 
  WriteData(String$, Len(String$)) 
  
EndProcedure 

Procedure.s ReadBinaryString()
  
  Length = ReadLong()
  String$ = Space(Length)
  ReadData(String$, Length) 
  
  ProcedureReturn String$
EndProcedure 


; Début de la démonstation

UnVaisseau.Ship
UpdateShip(UnVaisseau,"Mirage V",2500.0,20.00)

Debug "On créer un fichier de type binaire"
If CreateFile(0, "UnVaisseau.ship")
  
  WriteBinaryString(GetShipName(UnVaisseau))
  WriteFloat(GetShipSpeed(UnVaisseau))
  WriteFloat(GetShipSize(UnVaisseau))
  
  CloseFile(0)
  
EndIf 

Load.Ship

Debug "On ouvre le fichier de type binaire et"
Debug "on copie les données dans une structure"

If ReadFile(0, "UnVaisseau.ship")
  
  SetShipName(Load,ReadBinaryString())
  SetShipSpeed(Load,ReadFloat())
  SetShipSize(Load,ReadFloat())
  
  CloseFile(0)
  
EndIf 

Debug "On affiche le contenu de la Structure"
Debug GetShipName(Load)
Debug GetShipSpeed(Load)
Debug GetShipSize(Load)
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Un exemple avec une liste chainée :

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure >>>>>

Structure StructTest
  
  Byte.b
  Word.w
  Long.l
  Float.f
  String.s
  
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs >>>>>

Procedure SetStructTestByte(*ObjetA.StructTest, Byte.b)
  
  *ObjetA\Byte = Byte
  
EndProcedure

Procedure SetStructTestWord(*ObjetA.StructTest, Word.w)
  
  *ObjetA\Word = Word
  
EndProcedure

Procedure SetStructTestLong(*ObjetA.StructTest, Long.l)
  
  *ObjetA\Long = Long
  
EndProcedure

Procedure SetStructTestFloat(*ObjetA.StructTest, Float.f)
  
  *ObjetA\Float = Float
  
EndProcedure

Procedure SetStructTestString(*ObjetA.StructTest, String.s)
  
  *ObjetA\String = String
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs >>>>>

Procedure.b GetStructTestByte(*ObjetA.StructTest)
  
  ProcedureReturn *ObjetA\Byte
  
EndProcedure

Procedure.w GetStructTestWord(*ObjetA.StructTest)
  
  ProcedureReturn *ObjetA\Word
  
EndProcedure

Procedure.l GetStructTestLong(*ObjetA.StructTest)
  
  ProcedureReturn *ObjetA\Long
  
EndProcedure

Procedure.f GetStructTestFloat(*ObjetA.StructTest)
  
  ProcedureReturn *ObjetA\Float
  
EndProcedure

Procedure.s GetStructTestString(*ObjetA.StructTest)
  
  ProcedureReturn *ObjetA\String
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Update >>>>>

Procedure UpdateStructTest(*ObjetA.StructTest, Byte.b, Word.w, Long.l, Float.f, String.s)
  
  SetStructTestByte(*ObjetA, Byte)
  SetStructTestWord(*ObjetA, Word)
  SetStructTestLong(*ObjetA, Long)
  SetStructTestFloat(*ObjetA, Float)
  SetStructTestString(*ObjetA, String)
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Procedure WriteBinaryString(String$)
  
  WriteLong(Len(String$)) 
  WriteData(String$, Len(String$)) 
  
EndProcedure 

Procedure.s ReadBinaryString()
   
  Length = ReadLong()
  String$ = Space(Length)
  ReadData(String$, Length) 
  
  ProcedureReturn String$
EndProcedure 


; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

NewList Liste.StructTest()

String.s = "Bonjour !"

For Compteur = 0 To 5
  
  AddElement(Liste())
  UpdateStructTest(@Liste(), Byte.b, Word.w, Long.l, Float.f, String.s)
  
  Byte = Byte + 1 + Compteur
  Word = Word + 5 + Compteur
  Long = Long + 10000 + Compteur
  Float = 3.141592 + Compteur
  String = "Allô le monde no. " + Str(Compteur) + "!"
  
Next


ForEach Liste()
  
  Debug GetStructTestByte(@Liste())
  Debug GetStructTestWord(@Liste())
  Debug GetStructTestLong(@Liste())
  Debug GetStructTestFloat(@Liste())
  Debug GetStructTestString(@Liste())
  
Next


Debug "Création d'un fichier binaire"

If CreateFile(0, "Test.bin")
  
  ForEach Liste()
    WriteByte(GetStructTestByte(@Liste()))
    WriteWord(GetStructTestWord(@Liste()))
    WriteLong(GetStructTestLong(@Liste()))
    WriteFloat(GetStructTestFloat(@Liste()))
    WriteBinaryString(GetStructTestString(@Liste()))
  Next
  
  CloseFile(0)
  
EndIf 

ClearList(Liste())

Debug "On montre que la liste est vide : "
Debug "Nombre élément = " +  Str(CountList(Liste()))

Debug "On charge le fichier"


If OpenFile(0,"Test.bin")
  
  Repeat
    
    AddElement(Liste())
    SetStructTestByte(@Liste(),ReadByte())
    SetStructTestWord(@Liste(),ReadWord())
    SetStructTestLong(@Liste(),ReadLong())
    SetStructTestFloat(@Liste(),ReadFloat())
    SetStructTestString(@Liste(),ReadBinaryString())
    
  Until Eof(0)
  
EndIf 


Debug "On montre ce que la liste contient."

ForEach Liste()
  
  Debug GetStructTestByte(@Liste())
  Debug GetStructTestWord(@Liste())
  Debug GetStructTestLong(@Liste())
  Debug GetStructTestFloat(@Liste())
  Debug GetStructTestString(@Liste())
  
Next
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

Un autre exemple avec une liste chainée et un tableau statique Imbriqué

A+
Guimauve

Code : Tout sélectionner

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure >>>>>

Structure TestStruc
  
  Array.s[10]
  Maths.f
  Var.l
  
EndStructure

; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs >>>>>

Procedure SetTestStrucArray(*ObjetA.TestStruc, Index.b, Valeur.s)
  
  *ObjetA\Array[Index] = Valeur
  
EndProcedure

Procedure SetTestStrucMaths(*ObjetA.TestStruc, Maths.f)
  
  *ObjetA\Maths = Maths
  
EndProcedure

Procedure SetTestStrucVar(*ObjetA.TestStruc, Var.l)
  
  *ObjetA\Var = Var
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs >>>>>

Procedure.s GetTestStrucArray(*ObjetA.TestStruc, Index.b)
  
  ProcedureReturn *ObjetA\Array[Index]
  
EndProcedure

Procedure.f GetTestStrucMaths(*ObjetA.TestStruc)
  
  ProcedureReturn *ObjetA\Maths
  
EndProcedure

Procedure.l GetTestStrucVar(*ObjetA.TestStruc)
  
  ProcedureReturn *ObjetA\Var
  
EndProcedure

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Update >>>>>

Procedure UpdateTestStruc(*ObjetA.TestStruc, Maths.f, Var.l)
  
  SetTestStrucMaths(*ObjetA, Maths)
  SetTestStrucVar(*ObjetA, Var)
  
EndProcedure


; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

Procedure WriteBinaryString(String$)
  
  WriteLong(Len(String$)) 
  WriteData(String$, Len(String$)) 
  
EndProcedure 

Procedure.s ReadBinaryString()
  
  Length = ReadLong()
  String$ = Space(Length)
  ReadData(String$, Length) 
  
  ProcedureReturn String$
EndProcedure 

; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<


NewList SuperList.TestStruc()
Maths.f = 3.125
Var.l = 5

For Compteur = 0 To 20
  
  AddElement(SuperList())
  
  For Index = 0 To 9
    SetTestStrucArray(@SuperList(), Index, "Allo " + Str(Compteur * 5 + Index)) 
  Next 
  
  UpdateTestStruc(@SuperList(), Maths.f, Var.l)
  Maths = Maths + Compteur * 5
  Var = Var + Compteur * 3
  
Next


Debug "On montre le contenu"

ForEach SuperList()
  
  For Index = 0 To 9
    Debug GetTestStrucArray(@SuperList(), Index) 
  Next 
  Debug GetTestStrucMaths(@SuperList())
  Debug GetTestStrucVar(@SuperList())
  
Next


Debug "On créer un fichier"

If CreateFile(0, "SuperTest.bin")
  
  ForEach SuperList()
    
    For Index = 0 To 9
      WriteBinaryString(GetTestStrucArray(@SuperList(), Index))
    Next 
    WriteFloat(GetTestStrucMaths(@SuperList()))
    WriteLong(GetTestStrucVar(@SuperList()))
    
  Next
  
  CloseFile(0)
  
EndIf 


ClearList(SuperList())

Debug "On test si la liste est vide : "
Debug "Nombre d'élément = " +  Str(CountList(SuperList()))

Debug "On ouvre le fichier"

If OpenFile(0, "SuperTest.bin")
  
  Repeat
    AddElement(SuperList())
    For Index = 0 To 9
      SetTestStrucArray(@SuperList(), Index, ReadBinaryString())
    Next 
    SetTestStrucMaths(@SuperList(),ReadFloat())
    SetTestStrucVar(@SuperList(),ReadLong())
    
  Until Eof(0)
  
  CloseFile(0)
  
EndIf 


Debug "On montre le contenu après le chargement"

ForEach SuperList()
  
  For Index = 0 To 9
    Debug GetTestStrucArray(@SuperList(), Index) 
  Next 
  Debug GetTestStrucMaths(@SuperList())
  Debug GetTestStrucVar(@SuperList())
  
Next
Répondre