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

C Discussion :

Ecrire une structure dans un fichier binaire.


Sujet :

C

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut Ecrire une structure dans un fichier binaire.
    Bonjours a tous,

    Mon premier message sur ce forum que je fréquente depuis longtemps déjà..
    Donc je me présente : Sébastien étudiant en informatique..

    Je solicite votre aide car je ne verrai mon prof que Mecredi.. (Date de mon examen)
    J'ai besoin pour un exo de réussire a enregistrer les valeurs contenues dans une structure dans un fichier binaire.

    Donc j'ai ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct fiche {
    int nombre;
    char type;
    int val[2];
    }tab[9][9]
    Je dois pouvoir enregistrer en parcourant mon tableau de structure élément par élément, et surtout réussire a les relires par la suite en les replacants dans cette structure.

    évidement nous devont utiliser malloc pour reserver un espace mémoire, et ensuite utiliser fwrite et fread pour le fichier binaire.

    Je suis perdu niveau pointeur et malloc...

    Voici ce que j'ai déjà fait (uniquement avec un tableau de int)

    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
            int x,y,Nbr[2]={10,10};
            char Message[50];
            FILE *file_binaire;
     
            file_binaire = fopen("Fiches/file_binaire","wb");
     
     
     
     
            if (file_binaire == NULL)
            {
              printf("Erreur fopen\n");
              exit(0);
            }
     
     
            fwrite(Nbr,sizeof(int),2,file_binaire);
    Un grand merci pour votre aide, je suis bloqué la !!!

  2. #2
    Expert éminent sénior
    Avatar de Skyounet
    Homme Profil pro
    Software Engineer
    Inscrit en
    Mars 2005
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Software Engineer
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2005
    Messages : 6 380
    Points : 13 380
    Points
    13 380
    Par défaut
    Tu trouveras ton bonheur ici
    http://www.developpez.net/forums/sho...ichier+binaire

    Surtout le lien donné par Emmanuel.
    Introduction à Silverlight 4 (new) ; Localisation d'une application Silverlight (new) ;
    Mon espace perso[/B]

    La connaissance s’acquiert par l’expérience, tout le reste n’est que de l’information. Albert Einstein[/SIZE]

  3. #3
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Number
    J'ai besoin pour un exo de réussire a enregistrer les valeurs contenues dans une structure dans un fichier binaire.
    Le problème est plus complexe que tu ne l'imagines...

    http://emmanuel-delahaye.developpez....m#enreg_struct

    mais si tu fais abstraction de la portabilité, c'est très simple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    struct data
    {
       ...
    };
     
       struct data data = {...};
     
       <...>
       fwrite (data, sizeof data, fp);
    Pas de Wi-Fi à la maison : CPL

  4. #4
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Le problème est plus complexe que tu ne l'imagines...
    Oui, je me doute ...

    En faite voici le principe que je dois mettre en place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct fiche {
    char type;
    int val[2];
    }tab[9][9];
     
    /* Du coup je dois enregistrer chaques colonnes et chaques lignes (tab a 2 dimention) */
     
    for(i=0;i<=9;i++) {
    for(i=0;i<=9;i++) {
     
    /* Ma séquence de code pour l'ecriture */
    }
    }
    Pour que je puisse lire et ecrire sans problème sans me soucier de la taille..
    L'idéal est d'utiliser un malloc de la structure..

    Ce que j'enregistre sera donc de taille fixe (malloc(sizeof(struct fiche)) vu que le fichier est en binaire , j'aurais des blocs de x bytes constant !!
    De se faite en lisant le fichier je peux lire l'entiereté en un seul fread..
    Et le fread s'occupera de placer toutes mes données automatiquements dans une structure...

    Avec le malloc ca marche, notre prof nous propose cette solution..

    Le problème est de comment le mettre en place.

  5. #5
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Number
    En faite voici le principe que je dois mettre en place :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    struct fiche {
    char type;
    int val[2];
    }tab[9][9];
     
    /* Du coup je dois enregistrer chaques colonnes et chaques lignes (tab a 2 dimention) */
     
    for(i=0;i<=9;i++) {
    for(i=0;i<=9;i++) {
     
    /* Ma séquence de code pour l'ecriture */
    }
    }
    Beaucoup trop et inutilement compliqué. Si tu fais un enregistrement direct de l'image mémoire, étant donné que ta structure est linéaire, fwrite() suffit comme je te l'ai déjà montré. Tu as essayé ?
    Pour que je puisse lire et ecrire sans problème sans me soucier de la taille..
    L'idéal est d'utiliser un malloc de la structure..
    Je ne vois pas pourquoi.
    Ce que j'enregistre sera donc de taille fixe (malloc(sizeof(struct fiche)) vu que le fichier est en binaire , j'aurais des blocs de x bytes constant !!
    De se faite en lisant le fichier je peux lire l'entiereté en un seul fread..
    Oui, pareil pour l'écriture. Tu as lu ma réponse précédente ou pas ? Tu ne l'as pas comprise ?
    Pas de Wi-Fi à la maison : CPL

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Oui, je l'ai lu...
    Mais j'aimerais fair ca dans les regles de l'art ...

    Ma structure est en fait un tableau de structure...

    Selon le compilateur (Le prof test sous Suse, je programme sous Fedora..), je veux que ca fonctionne et le programme de fin d'année doit quand même avoir une certaine qualité..

    Je voullais donc faire ça au mieux..

    De plus comme j'ai suivit ton lien, il parle bien des problèmes d'ecriture en binaire.
    Sans passer par des normes pour la tailles.. J'aimerais avoir un truc net et propre..

    Evidement, si mnt tu me certifie que ce code ira sous win/unix.. Alors je suis partant.

    Pour la lecture, notre professeur nous a bien parlé de tout lire d'une traite..
    Pour l'ecriture, je me souvient de malloc... etrange :-(

    Edit :

    Ha oui, j'ai oublié de préciser évidement que la structure pouvait avoir de légère modification car je dois ajouter un système de position (style touché coullé) dedans pour la position de mes cases voici le type de fichier en mode texte :

    N 0 0
    D 0 1 45 6
    D 0 1 7 2
    B 1 2


    Etc .. les N etant une case noir, d definition, et b blanche..
    Du coup certaine definition dans ma structure ne seront pas affectée.
    Comment du coup être certain que lors du fread il se plantera pas ?
    Merci a vous

  7. #7
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Number
    Mais j'aimerais fair ca dans les regles de l'art ...

    Ma structure est en fait un tableau de structure...
    Si tu dois être portable, je conseille un fichier texte (détails dans mon article) . Là, tu pourras jouer avec malloc() en lecture...
    Pas de Wi-Fi à la maison : CPL

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Nan, justement ...

    Alors, voici le projet ainsi ca deviendra plus clair :

    C'est un jeux de kakuro ( http://www.apprendre-en-ligne.net/bl...ges/kakuro.gif ) avec des grilles dynamiques, chargées dans des fichiers textes avec des lignes du type :

    B 0 0 (Ligne blance sans rien)
    D 0 1 x y (Ligne definition avec x pour l'horizontal et y vertical)
    N 0 3 (Ligne noir)
    Les lettres sont le type de lignes
    les deux premiers chiffres sont leurs position (style touché coullé)
    les deux chiffres suivant sont utilisés pour remplire les cases blanches et definitions.

    En fct de la case j'ai donc des structures plus ou moin remplie (par exemple aucune valeur)..
    Vu qu'en fonction du compilateur un int peut être initialisé a différente valeurs.

    Du coup, j'ésperais m'en sortir avec un malloc de la structure pour recuperer des bloc de x Bytes dans mon fichier binaire.

    On est obligé d'utiliser des fichiers binaires pour empecher la modification par un joueur et car c'est une evolution de notre projet demandée par le prof.

    Serait-ce une bétise:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    /* Exemple tout con de mon idée */
    Message = (struct *grille)malloc(sizeof(struct grille));
     
    fwrite(Message,sizeof(struct fiches),*fp);
    Evidement se code n'est pas complet.. mais je me souvient vraiment bien du malloc, que je n'ai malheureusement pas su noter en cours....

  9. #9
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Personne pour une tite aide ?

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Number
    Personne pour une tite aide ?
    Enregistrement :

    - Ecrire tout le tableau d'un coup avec fwrite()

    Récupération :

    - lire une première fois le fichier par bloc de la taille d'un enregistrement (élément du tableau) avec fread()
    - compter les enregistrements
    - revenir au début (rewind())
    - allouer le tableau en fonction de la taille mesurée
    - lire par bloc de 1 enregistrement
    - copier dans le tableau.

    C'est difficile de trouver ça ? C'est le B.A. BA des traitements de fichiers... Tu dormais en cours visiblement...
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Réponses: 17
    Dernier message: 09/03/2007, 18h13
  2. stocker une structure dans un fichier ini?
    Par Mickey.jet dans le forum C
    Réponses: 6
    Dernier message: 13/09/2006, 16h57
  3. ecrire une chaine dans un fichier [prob]
    Par rogerio dans le forum C++
    Réponses: 5
    Dernier message: 31/05/2006, 02h20
  4. Ecrire une variable dans un fichier
    Par slam dans le forum Général Python
    Réponses: 2
    Dernier message: 14/04/2006, 18h58
  5. copier une structure dans un fichier
    Par brute dans le forum MFC
    Réponses: 18
    Dernier message: 10/03/2006, 14h30

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