Entrer une structure dans un fichier random

Signaler
-
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
-
Alors bonjour à tous, voilà ma structure:
Public Structure Commande
        Dim nomPers As String
        Dim prenPers As String
        Dim Etat As String
        Dim numeroChambre As Integer
        Dim tabPersonnes() As cmdPersonne
        Dim lieu As String
        Dim heure As Integer
        Dim minute As Integer
        Dim total As String
    End Structure
    Public Structure cmdPersonne
        Dim boissonChaude As String
        Dim viennoiseries() As String
        Dim accomendements() As String
        Dim boissonFroide As String
        Dim suppléments() As String
    End Structure
Public chambres As Commande

Ensuite j'ai une fonction qui crée un fichier binaire ainsi que l'initialise (je dis pas que c'est bien de le remplir comme ça mais apparement c'est une consigne)
  
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
        Dim fn, i As Integer
        fn = FreeFile()
        FileOpen(fn, "H:\DonneesHotel.ach", OpenMode.Random, OpenAccess.Write, , Len(chambres))
        For i = 1 To 96
            FilePut(fn, chambres, i)
        Next i
        FileClose(fn)
    End Sub

Et donc à un moment donné, j'attribue ces valeurs là par exemple:
chambres.numeroChambre = rep
chambres.nomPers = txtNom.Text
chambres.prenPers = txtPrenom.Text
chambres.lieu = CboxLieu.Text
chambres.Etat = "FAITE"

JE fais ensuite
dim nf as integer
nf=freefile()
FilePut(nf, chambres,1)

Ca marche, mais bizzarement, quand je fais :
chambres.Etat
FilePut(nf, chambres,1)

C'est à dire , je veux changer d'état.

Et j'ai cette erreur là:
System.IO.IOException
Longueur d'enregistrement incorrecte.
Pouvez vous m'aider?

5 réponses

Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
Salut

Introduction : Cet explicatif est basé sur l'expérience en VB6 (32 bits) et ne s'applique peut-être pas à VB/Net, mais je ne pense pas que les fichiers Random de VB.Net diffèrent beaucoup de leurs prédécesseurs.

Je n'ai pas tout lu, mais un peu de théorie s'impose.
Les fichiers Random permettent d'accéder à l'enregistrement X simplement en calculant l'offset, le décalage des enregistrements entre eux, basé sur la taille de la structure.
Avec un type String, aucune limite de longueur n'est imposée|définie, donc il devient impossible de calculer ce décalage.

Ce n'est pas un problème pour les types Integer ou Long (et autres) puisque leur format est connu (Long en 32 bits 4 octets en VB6/VBA et 64 bits 8 octets en .Net), mais pour les string, aucune limite n'est définie (puisque ce ne sont que des pointeurs vers des zones mémoire).
Il te faut définir le masque de structure avec des String limitées en longueur. Trop court, tes données seront tronquées; trop long, le fichier grossira.
Alors définir un masque de structure avec des tableaux (à dimension variable) de String; c'est, je pense, impensable (amusant, non ?) .

Vala
Jack, =fr MVP VB
NB : Je ne répondrai pas aux messages privés

Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)

Je pense avoir compris ce que tu veux dire, mais tu me conseillerais de changer de structure.. ou tout simplement ne pas faire une boucle "FOR" à la création du fichier?
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
Oui, il te faut modifier ta structure :
- Si tu veux vraiment utiliser ton fichier en accès Random, il te faut que chaque item ait une taille connue.
- Si tu oublies le Random et que tu gères un simple fichier à accès séquentiel où chaque ligne représentera une donnée, il faudra dimensionner tes tableaux d'une manière fixe ou bien insérer un nouvel Item afin de connaitre le nombre de lignes à suivre lors de la lecture de tes tableaux.
Messages postés
14008
Date d'inscription
samedi 29 décembre 2001
Statut
Modérateur
Dernière intervention
28 août 2015
76
PS : Pourquoi ne passes-tu pas à une gestion par base de donnée ?
Ce serait plus efficace
Messages postés
1207
Date d'inscription
dimanche 20 avril 2003
Statut
Membre
Dernière intervention
4 juin 2016
10
Bonjour,

Si tu tiens vraiment à ce genre de choses, tu peux ajouter à ta structure, en PREMIER champ, la taille de celle-ci en Integer ou Long et tu stockeras juste avant l'écriture la longueur de ta structure (len(myStructure)).

En lecture, tu connais la longueur de ta structure en lisant les 4/8 premiers octets. Je pense que le principe fonctionne mais je n'ai pas essayé utilisant comme le préconise Jack les SGBD.


Calade