IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Forms Discussion :

[VS2005]lecture/écriture dans fichier binaire


Sujet :

Windows Forms

  1. #1
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut [VS2005]lecture/écriture dans fichier binaire
    Plus précisement, je cherche à manipuler ces structures imbriquées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
     public struct stInformationsMOXA
                {
                public bool bEtatConnexion;
                public char[] szAdresseIP; 
                public int nNumeroPort;
                }
            
            public struct stInformationsSILDB
                {
                public bool bEtatConnexion;
                public char[] szNomBase; 
                }
            
            public enum ListeTypeCommunication 
                { 
                eComHousseuse,
                eComSILDB
                };
            
            public enum ListeEtatPalette
                {
                ePaletteEntreeHousseuse,
                ePaletteSortieHousseuse
                };
            
            public struct stDonneesEchangees
                {
                public ListeTypeCommunication TypeCommunication;
                public DateTime date;
                public char[] szDonneesBrutes;// = new char[200];
                public int nNumPalette;
                public char[] szNumeroOF; // = new char[20];
                public int nCodeHoussage;
                public ListeEtatPalette EtatPalette;
                }
            
            public struct stDonneesIHM
                {
                public stInformationsMOXA InformationsMOXA;
                public stInformationsSILDB InformationsSILDB;
                public stDonneesEchangees[] DonneesEchangees; 
                public int nIndexDernierstDonneesEchangees;
                }
    Pour cela j'utilise les fonctions suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    public static byte[] ecrire(object St)
            {
                int rawsize = Marshal.SizeOf(St);
                IntPtr buffer = Marshal.AllocHGlobal(rawsize);
                Marshal.StructureToPtr(St, buffer, false);
                byte[] rawdatas = new byte[rawsize];
                Marshal.Copy(buffer, rawdatas, 0, rawsize);
                Marshal.FreeHGlobal(buffer);
                return rawdatas;
            }
    
            public static stDonneesIHM lire(BinaryReader br)
            {
                stDonneesIHM Str = new stDonneesIHM();
                byte[] buff = br.ReadBytes(Marshal.SizeOf(Str));
                int rawsize = Marshal.SizeOf(Str);
                if (rawsize > buff.Length)
                    return Str;
                IntPtr buffer = Marshal.AllocHGlobal(rawsize);
                Marshal.Copy(buff, 0, buffer, rawsize);
                Str = (stDonneesIHM)Marshal.PtrToStructure(buffer, Str.GetType());
                Marshal.FreeHGlobal(buffer);
                return Str;
            }
    que j'utilise de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    // Initialisation des éléments graphiques
                InitializeComponent();
    
                //création des structures de données
                stInformationsMOXA InfoMOXA = new stInformationsMOXA();
                InfoMOXA.szAdresseIP = new char[20];
    
                stInformationsSILDB InfoSILDB = new stInformationsSILDB();
                InfoSILDB.szNomBase = new char[20];
    
                stDonneesEchangees DonEch = new stDonneesEchangees();
                DonEch.szDonneesBrutes = new char[200];
                DonEch.szNumeroOF = new char[20];
    
                stDonneesIHM DonIHM = new stDonneesIHM();
                DonIHM.DonneesEchangees = new stDonneesEchangees[200];
               
                //remplissage des sturctures
                InfoMOXA.bEtatConnexion = true;
                InfoMOXA.nNumeroPort = 6;
                String AdIP = "gsd4565";
                InfoMOXA.szAdresseIP = AdIP.ToCharArray();
    
                InfoSILDB.bEtatConnexion = false;
                String NomBD = "vsds";
                InfoSILDB.szNomBase = NomBD.ToCharArray();
    
                DonEch.date = DateTime.Now;
                DonEch.EtatPalette = ListeEtatPalette.ePaletteEntreeHousseuse;
                DonEch.nCodeHoussage = 2;
                DonEch.nNumPalette = 25;
                String DonBr = "dgzgzgr";
                DonEch.szDonneesBrutes = DonBr.ToCharArray();
                String NumOF = "dg4";
                DonEch.szNumeroOF = NumOF.ToCharArray();
                DonEch.TypeCommunication = ListeTypeCommunication.eComHousseuse;
    
                DonIHM.DonneesEchangees[0] = DonEch;
                DonIHM.InformationsMOXA = InfoMOXA;
                DonIHM.InformationsSILDB = InfoSILDB;
                DonIHM.nIndexDernierstDonneesEchangees = 0;
    
                //gestion fichiers binaires
                
                FileStream fw = null;
                FileStream fr = null;
    
                BinaryReader br = null;
                BinaryWriter bw = null;
                                 
                try
                {
                    // si Le fichier n'existe pas, on le crée, sinon ouverture
                    fw = File.Create("H:/DonIHM.bin");
                    
                    bw = new BinaryWriter(fw);
    
                    bw.Write(ecrire(InfoMOXA));
                                    
                    bw.Close();
                    fw.Close();                               
                                  
                    // Ouverture du contenu du fichier 
                    fr = File.Open("H:/DonIHM.bin", FileMode.Open);
                    br = new BinaryReader(fr);
    
                    stInformationsMOXA stInfoMOXA = lire(br);
    
                    LB_Data.Items.Add("MOXA connectée : " + stInfoMOXA.bEtatConnexion);
                    LB_Data.Items.Add("Numero port : " + stInfoMOXA.nNumeroPort);
                    LB_Data.Items.Add("adresse IP : " + stInfoMOXA.szAdresseIP);
    
                    fr.Close();
                    br.Close();
                }
    
                finally
                {
                    if (br != null) br.Close();
                    if (bw != null) bw.Close();
                }
    Le code est généré sans aucune erreur ni warning, par contre à l'execution, j'ai une erreur "Specified array was not of the expected type." sur la ligne "Marshal.StructureToPtr(St, buffer, false);" (en gras dans le code) de la fonction ecrire.

    Cela vient-il du fait que j'ai des structures imbriquées ?

    Comment faire dans mon cas particulier ?

  2. #2
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Après quelques heures de test, je pense enfin avoir trouvé l'origine du problème : Marshal.StructureToPtr(St, buffer, false); ne gère pas les tableaux de caractères !!

    Quequ'un connait-il une solution à ce problème ?

  3. #3
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Il me semble que le type String est marshallé automatiquement en tableau de char... donc il te suffirait de déclarer des string plutot que des char[] (en mettant je ne sais plus quel attribut pour spécifier la longueur).

  4. #4
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Citation Envoyé par tomlev Voir le message
    (en mettant je ne sais plus quel attribut pour spécifier la longueur).
    justement, j'arrive pas à trouver comment faire ca

  5. #5
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    MarshalAsAttribute peut-être ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    [MarshalAs(UnmanagedType.LPStr, SizeConst=100)]
    public string mystring1;

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    tu as répondu avant même que j'aie édité mon post ... regarde plus haut, ça devrait résoudre ton problème.

  7. #7
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Ca se complique maintenant, j'ai une autre erreur, tjs sur la meme ligne : "The parameter is incorrect. (Exception from HRESULT: 0x80070057 (E_INVALIDARG))"

    Je commence à en perdre mon sang-froid

    [edit]
    Je pense que cette fois ca peut venir du fait que j'ai des structures imbriquées non ?

    car qd je fais fais un test de lecture/ecriture pour InfoMOXA ca passe sans aucun pb
    [/edit]

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Les paramètres que j'ai mis ne sont peut-être pas les bons... mais à mon avis tu es sur la bonne piste !

  9. #9
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Si si, ce sont les bons, mais doit y avoir un truc spécial à faire dans le cas des structures imbriquées !

    [edit] En fait non, c'est encore un problème de tableau qui n'est pas géré, et la c'est complexe, vu que c'est un tableau qui regroupe des structures "public stDonneesEchangees[] DonneesEchangees;" (mis en gras ds le code) [/edit]

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 753
    Points
    39 753
    Par défaut
    Apparemment le marshalling de structures imbriquées n'est pas supporté... Il faudrait "aplatir" ta structure.
    http://www.dotnet247.com/247referenc...23/119908.aspx
    Tu peux toujours poser la question sur les forums Microsoft, c'est encore là que tu auras la meilleure réponse...

    EDIT: Ce lien pourra peut-être t'aider :
    http://blogs.msdn.com/jaredpar/archi...11/437584.aspx

  11. #11
    Membre émérite Avatar de shadowmoon
    Homme Profil pro
    Expert technique et fonctionnel .Net
    Inscrit en
    Mai 2005
    Messages
    1 066
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Expert technique et fonctionnel .Net
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 066
    Points : 2 645
    Points
    2 645
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Apparemment le marshalling de structures imbriquées n'est pas supporté... Il faudrait "aplatir" ta structure.
    http://www.dotnet247.com/247referenc...23/119908.aspx
    Tu peux toujours poser la question sur les forums Microsoft, c'est encore là que tu auras la meilleure réponse...
    Avec visual studio 2005; l'imbrication des structures passent sans problème, c'est encore une histoire de tableau !

    Citation Envoyé par tomlev Voir le message
    EDIT: Ce lien pourra peut-être t'aider :
    http://blogs.msdn.com/jaredpar/archi...11/437584.aspx
    oui, ca l'air d'etre exactement ce que je veux faire.

    merci pour ton aide

    [edit] ca m'arrache les yeux d'une force, je vais essayer de trouver qqch de + lisible [/edit]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. lecture zstring dans fichier binaire
    Par olibara dans le forum C#
    Réponses: 0
    Dernier message: 17/08/2009, 12h58
  2. lecture/écriture dans un fichier
    Par benkunz dans le forum Langage
    Réponses: 3
    Dernier message: 10/04/2007, 11h35
  3. Réponses: 47
    Dernier message: 28/01/2007, 19h39
  4. lecture écriture dans un fichier
    Par poukill dans le forum C++
    Réponses: 9
    Dernier message: 23/05/2006, 11h02
  5. [PERL] Problème lecture/écriture dans un fichier
    Par LE NEINDRE dans le forum Langage
    Réponses: 4
    Dernier message: 17/08/2005, 13h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo