Enfin !
Depuis 3 semaines, je cherchais à écrire une structure dans un fichier binaire. J'ai enfin réussi. Ce code écrit 5 enregistrements dans un fichier binaire, puis les lit, tout simplement ! Il faut passer par la sérialisation/désérialisation.
J'ai mis un seul commentaire car je pense que le code est assez clair (?)
Source / Exemple :
Imports System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
Imports System.IO
Public Module Module1
Dim nom_fichier As String = "test.bin"
<Serializable()> _
Public structure HighScore
' attributs
Private _pseudo As String
Private _score As Integer
Private _reussite As Double
Private _duree_jeu As TimeSpan
' propriétés
Public Property pseudo() As String
Get
Return _pseudo
End Get
Set(ByVal value As String)
_pseudo = value
End Set
End Property
Public Property score() As Integer
Get
Return _score
End Get
Set(ByVal value As Integer)
_score = value
End Set
End Property
Public Property reussite() As Double
Get
Return _reussite
End Get
Set(ByVal value As Double)
_reussite = value
End Set
End Property
Public Property duree_jeu() As TimeSpan
Get
Return _duree_jeu
End Get
Set(ByVal value As TimeSpan)
_duree_jeu = value
End Set
End Property
' Constructeur
Public Sub New(ByVal __pseudo As String, ByVal __score As Integer, _
ByVal __reussite As Double, ByVal __duree_jeu as TimeSpan)
_pseudo = __pseudo
_score = __score
_reussite = __reussite
_duree_jeu = __duree_jeu
End Sub
End Structure
Public sub Serialize(ByVal struct As HighScore, ByVal fichier As String)
Dim serializer As Runtime.Serialization.Formatters.Binary.BinaryFormatter = _
New Runtime.Serialization.Formatters.Binary.BinaryFormatter
Dim stream As FileStream
'If struct Is Nothing Then Return False
If Not File.Exists(fichier) Then
stream = New FileStream(fichier, FileMode.Create)
Else
stream = New FileStream(fichier, FileMode.Append)
End If
serializer.Serialize(stream, struct)
stream.Close()
End sub
Public Function Deserialize(ByVal fichier As String) As Boolean
Dim deserializer As Runtime.Serialization.Formatters.Binary.BinaryFormatter = _
New Runtime.Serialization.Formatters.Binary.BinaryFormatter
Dim stream As FileStream
Dim result As HighScore
If Not File.Exists(fichier) Then
return false
else
stream = New FileStream(fichier, FileMode.Open)
While True
Try
result = deserializer.Deserialize(stream)
Console.WriteLine("Pseudo : {0}, score : {1} bonnes réponses, reussite : {2}%, temps : {3}.", result.pseudo , result.score, result.reussite, result.duree_jeu)
stream.Flush
Catch
Exit While
End Try
End While
stream.Close()
console.ReadLine
return true
End If
End Function
Sub Main()
' TimeSpan exprime une durée
Dim duree As New TimeSpan(1000000000000)
Serialize(New HighScore("Fabien",15,70.5,duree), nom_fichier)
Serialize(New HighScore("Casy",13,80.33,duree), nom_fichier)
Serialize(New HighScore("Willy",13,70.67,duree), nom_fichier)
Serialize(New HighScore("X",11,98.5,duree), nom_fichier)
Serialize(New HighScore("CharlesRacaud",10, 92.15,duree), nom_fichier)
If not Deserialize(nom_fichier) Then
Console.WriteLine("Le fichier n'existe pas.")
End If
End Sub
End Module
Conclusion :
Bon je ne sais pas parcourir un fichier alors j'ai mis un "Try". En effet, While not (result is nothing) ne marche pas : le compilateur bloque sur le Is.
Pour les newbies, comme moi, pour faire marcher ce programme :
1/Ouvrez un projet vide.
2/Ajouter un fichier vide.
3/Faites un copier-coller de mon code.
4/Lancer la compilation.
n.b.Cet exemple est intéressant car il lit plusieurs enregistrements. Dans tous les exemples/tutos lus, seul un enregistrement était concerné.
J'espère que ce code aidera les débutants comme moi, qui ont galéré pour écrire de simples structures dans un simple fichier binaire. A noter que cet exemple doit aussi marcher pour les objets. Dans ce cas, il faut remplacer le Structure par Class.
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.