Probleme FILEPUTOBJECT fichier TYPE RANDOM et STRUCTURE

cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 - 21 juin 2012 à 15:20
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 - 22 juin 2012 à 09:30
bonjour

ca fait 2 jours et 2 nuits que je cherche une solution à mon problème que je vous explique.

Voilà, j'ai besoin d'avoir un fichier en acces direct et j'utilise les commandes suivantes :

fileopen
filegetobject
fileputobject
fileclose

or j'ai un message qui me dit que la structure xxx n'est pas valide par rapport à la commande fileputobject.

Voici un extrait de mon code


imports system.IO
Public Structure batiment
        Dim numeroprod As Integer
        Dim levelbat As Byte
        Dim zone As Byte
        Dim tempsprod As DateTime
        Dim valide As Byte
        <VBFixedString(200)> Dim chaine As String
    End Structure
    Public libre As Long = 0
    Public nomflile As String = My.Application.Info.DirectoryPath & "\base.bdd"
    Public rlile As batiment
    Dim reclong As Long = Len(rlile)
    Public longflile As Long = 0
sub
    libre = FreeFile()
    FileOpen(libre, nomflile, OpenMode.Random, OpenAccess.ReadWrite, OpenShare.Shared, reclong)
        longflile = FileLen(nomflile) / reclong
        If longflile <= 0 Then Exit Sub
        Dim vijk As Long = 0
        For vijk = 1 To tbatile ' contient le nombre de batiments à sauvegarder
            'expres je n'assigne pas les champs de la structure pour alleger le code
            FilePutObject(libre, rlile) ' c'est ici que ca coince 
        Next
      FileClose(libre)
 End Sub  


j'ai essayé le code en otant le champ de type STRING ca ne change rien à l'erreur.

Donc si vous avez déjà trouvé une méthode pour faire marcher les commandes en question, je suis preneur.

D'avance merci pour votre aide
bidouille007

13 réponses

ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
21 juin 2012 à 16:02
Bonjour,
je ne sais pas ce que tu fabriques.
A ce stade, je me contente de constater que ta variable rlile ne contient de toutes manières rien. Elle est seulement déclarée du type de ta structure batiment, mais ne contient rien.


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
21 juin 2012 à 16:08
que la variable soit vide je ne vois pas en quoi cela gêne je peux avoir besoin d'un enregistrement à vide

j'ai mis en commentaire que j'ai volontairement supprimé du code pour l'alleger l'affectation des champs de la structure.

bidouille007
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
21 juin 2012 à 19:45
Bonjour,

Concernant .NET :
- On préfère les opérations sur les flux plutot que FiloOpen
- En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).
- Regardes aussi du coté de la sérialisation.

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
21 juin 2012 à 19:54
merci pour vos réponses.

Mais cela veut il dire que c'est impossible de faire ce que je souhaite avec les commandes fileopen filegetobject fileputobject fileclose ?

bidouille007
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
21 juin 2012 à 20:20
Bonjour,

Il te faudra utiliser les Flux (Io.Stream) et faire toi même ta gestion de base de données (calculer les offsets, longueurs, ...).

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
21 juin 2012 à 20:35
encore merci

aurais tu la possibilité de me donner un lien qui me montre comment faire ce que je souhaite via les streams que je maitrise pas vraiment.

je m'étonne cependant que ces commandes sont présentes dans VB.NET qui ne sont pas exploitables ???

de te lire

bidouille007
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
21 juin 2012 à 21:02
Bonjour,

L'alternative existe avec les bases de données par exemple.

Sinon, consternant les sources, il y a de bons exemples sur MSDN.

Après, il faut utiliser la méthode Seek du flux pour positionner le curseur.

Mais dans ton cas, une base de données semble plus indiquée.
Regardes MySql, Access, Sql Server, SqlLite, ...

---------------------------------------------------------------------
[list=ordered][*]Pour poser correctement une question et optimiser vos chances d'obtenir des réponses, pensez à lire le règlement CS, celui-ci pour bien poser votre question ou encore celui-ci pour les PFE et autres exercices.[*]Quand vous postez un code, merci d'utiliser la coloration syntaxique (3ième icône en partant de la droite : ).[*]En VB.NET pensez à activer Option Explicit et Option Strict (propriété du projet) et à retirer l'import automatique de l'espace de nom Microsoft.VisualBasic (onglet Références dans les propriétés du projet).[*]Si votre problème est résolu (et uniquement si c'est le cas), pensez à mettre "Réponse acceptée" sur le ou les messages qui vous ont aidés/list
---
Mon site
0
Utilisateur anonyme
21 juin 2012 à 23:36
Bonsoir,

j'ai besoin d'avoir un fichier en acces direct
Tu peux préciser un peu plus s'il te plaît ?
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
22 juin 2012 à 01:57
bonsoir

je veux pouvoir enregistrer une structure autant de fois que j'ai besoin et il m'avait semblé que les commandes fileopen fileputobject filegetobject et fileclose suffisaient à mes besoins mais il semble que ce ne soit pas possible.

et je ne vois pas quoi ajouté de plus à ma première demande

si vous avez une idée je suis preneur car là je suis parti pour stocker mes infos dans un fichier texte pas que ca me plaise, mais je ne maitrise pas les commandes stream indiquées dans les réponses.

Merci d'avance

bidouille007
0
cs_bidouille007 Messages postés 257 Date d'inscription jeudi 11 septembre 2008 Statut Membre Dernière intervention 22 décembre 2012 1
22 juin 2012 à 03:42
je reviens car j'ai trouvé un bout de code que j'ai recopié et qui fonctionne dans mon programme

Structure CustomerRecord
        Public OrderNumber As Integer
        Public Name As String
        Public OrderDate As Date
    End Structure

    Sub WriteData()
        Dim MyRecord As CustomerRecord
        Dim RecordNumber As Integer
        Dim RecordDate As Date
        ' Open file for random access.
        FileOpen(1, "C:\TESTFILE.txt", OpenMode.Binary)
        For RecordNumber = 1 To 3   ' Loop 3 times.
            MyRecord.OrderNumber = RecordNumber    ' Define OrderNumber.
            MyRecord.OrderDate = RecordDate          ' Define OrderDate.
            MyRecord.Name = "My Name" & RecordNumber ' Create a string.
            FilePut(1, MyRecord)                 ' Write record to file.
        Next RecordNumber
        FileClose(1)
    End Sub


quand je fais exactement pareil pour sauvegarder mes données j'ai toujours le meme méssage, je comprends pas.
J'ai pourtant remplacé les champs de type byte en integer, supprimer la longueur de la chaine de caractère et pour finir remplacer le type datetime en type date.

Au secours

la source du bout de code

bidouille007
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 juin 2012 à 07:24
Ecoute, bidouille007,

Je ne suis pas vb.Nettiste, mais crois pouvoir t'éclairer à l'aide de ce petit test que je viens de faire sous VB6 et qui devrait pouvoir être transposé extrêmement facilement.
Private Type mon_type
    nom As String * 15
    prenom As String * 30
End Type

Private Sub Command1_Click()
Dim enregistrement As mon_type, unnumero
Open "c:\essai.txt" For Random As #1 Len = Len(enregistrement)
    For unnumero = 1 To 5
      enregistrement.nom = "un nom" & unnumero
      enregistrement.prenom = "un prenom" & unnumero
      Put #1, unnumero, enregistrement
   Next unnumero
Close #1
End Sub

Private Sub Command2_Click()
Dim enregistrement As mon_type, unnumero
Open "c:\essai.txt" For Random As #1 Len = Len(enregistrement)
    For maposition = 1 To 5
      Get #1, maposition, enregistrement
      MsgBox "enregistrement n° " & maposition & vbCrLf & _
      "nom " & enregistrement.nom & vbCrLf & "prénom " & enregistrement.prenom
    Next maposition
Close #1
End Sub


Command1 y écrit 5 enregistrement
Command2 les y lis ensuite.

________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
ucfoutu Messages postés 18038 Date d'inscription lundi 7 décembre 2009 Statut Modérateur Dernière intervention 11 avril 2018 211
22 juin 2012 à 07:26
Note que j'ouvre en mode random et que je passe la longueur de la structure (nécessaire).


________________________
Réponse exacte ? => "REPONSE ACCEPTEE" pour faciliter les recherches.
Pas d'aide en ligne installée ? => ne comptez pas sur moi pour simplement vous dire ce qu'elle contient. Je n'interviendrai qu'en cas de nécessité de développ
0
NHenry Messages postés 15112 Date d'inscription vendredi 14 mars 2003 Statut Modérateur Dernière intervention 13 avril 2024 159
22 juin 2012 à 09:30
Bonjour,

Voir avec :
http://www.codeproject.com/Articles/11271/Read-and-Write-Structures-to-Files-with-NET
ou regardes du coté des fichiers XML (System.XML) si tu as du mal avec les Stream.


Mon site
0
Rejoignez-nous