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 :

Fwrite() et fread() : les données ne correspondent pas


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Collégien
    Inscrit en
    Juin 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 13
    Points : 11
    Points
    11
    Par défaut Fwrite() et fread() : les données ne correspondent pas
    Bonjour j'ai fait deux fonction une fonction save et load permettant de sauvegarder et charger ma structure



    Sauvegarde :

    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
    void saveZone(zone* z)
    {
    FILE* fd  =NULL;
    int size = 7;
     
     
    if(nbZone >9)
    size++;
     
    if(nbZone>99)
    size++;
     
    char nullvalue = -1;
    short nullvalueshort = -1;
    char buff[size];
    char path[] = "zone/%d";
     sprintf(buff, path, nbZone-1);
    fd = fopen(buff,"ab+");
     
      if(fd == NULL) {
        perror("Erreur ouverture fichier ");
        exit(EXIT_FAILURE);
      }
     
      if(!fwrite( &z->sizex,sizeof(short),1,fd)) {
        perror("Erreur lors de l'ecriture de sizex ");
        exit(EXIT_FAILURE);
      }
       if(!fwrite( &z->sizey, sizeof(short),1,fd)) {
        perror("Erreur lors de l'ecriture de sizey ");
        exit(EXIT_FAILURE);
      }
     
     
     
     if(!fwrite( &z->foodSpawnfreq,sizeof(short),1,fd)) {
        perror("Erreur lors de l'ecriture de foodSpawnfreq ");
        exit(EXIT_FAILURE);
      }
       if(!fwrite( &z->foodUnit,sizeof(short),1,fd)) {
        perror("Erreur lors de l'ecriture de foodUnit ");
        exit(EXIT_FAILURE);
      }
       if(!fwrite( &z->sourceFood,sizeof(short),1,fd)) {
        perror("Erreur lors de l'ecriture de sourceFood ");
        exit(EXIT_FAILURE);
      }
    int i=0;
    for(i=0;i< (z->sizex * z->sizey);i++)
    {
     
     
     
    	Case* c = z->cases[i];
     
     
     
     
    	if(!fwrite( &c->obstacle, sizeof(char),1,fd)) {
    	    perror("Erreur lors de l'ecriture de obstacle ");
    	    exit(EXIT_FAILURE);
    	  }
     
     
    	 if(c->bibit != NULL)
    	 {
     
    		bibite* b = c->bibit;
    		if(fwrite( &b->type,sizeof(char),1,fd) == -1) {
    		    perror("Erreur lors de l'ecriture de type ");
    		    exit(EXIT_FAILURE);
    		  }
     
    	  }
    	 else if(fwrite( &nullvalue,sizeof(char),1,fd) == -1) {
    		    perror("Erreur lors de l'ecriture de l'entier 3");
    		    exit(EXIT_FAILURE);
    	 }
     
     
      if(c->fourmi != NULL)
    	 {
    	   fourmis* f = c->fourmi;
    		if(fwrite( &f->type,sizeof(char),1,fd) == -1) {
    		    perror("Erreur lors de l'ecriture de type ");
    		    exit(EXIT_FAILURE);
    		  }
     
     
    	  }
    	 else if(fwrite( &nullvalue,sizeof(short),1,fd) == -1) {
    		    perror("Erreur lors de l'ecriture de l'entier 2");
    		    exit(EXIT_FAILURE);
    	 }
     
     
    	 if(c->fourmilier != NULL)
    	 {
    	   short i;
    	   fourmiliere* f = c->fourmilier;
     
    		if(fwrite( &f->nbTypeFourmis,sizeof(short),1,fd) == -1) {
    		    perror("Erreur lors de l'ecriture de type ");
    		    exit(EXIT_FAILURE);
    		  }
              int j = 0;
    		  for(j=0;j<f->nbTypeFourmis;j++)
    		  {
    		   TypeFourmi *tf = f->typeFourmis[j];
     
                   if(fwrite( &f->probaSpawn[j], sizeof(float),1,fd) == -1) {
                    perror("Erreur lors de l'ecriture de a probabilité du type ");
                    exit(EXIT_FAILURE);
                  }
     
    		  }
    	  }
    	 else if(fwrite( &nullvalueshort,sizeof(short),1,fd) == -1) {
    		    perror("Erreur lors de l'ecriture de l'entier 1");
    		    exit(EXIT_FAILURE);
    	 }
     
     
     
     
    }
     
      fclose(fd);
    Chargement :


    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
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
     
     
     
    zone* loadzone(char* path)
    {
    FILE* fd = NULL;
    zone* z = malloc(sizeof(zone));
     
    fd = fopen(path, "r");
     
      if(fd == -1) {
        perror("Erreur ouverture fichier ");
        exit(EXIT_FAILURE);
      }
     
      if(!fread( &z->sizex ,sizeof(short),1,fd)) {
        perror("Erreur lors de l'ecriture de sizex ");
        exit(EXIT_FAILURE);
      }
       if(!fread( &z->sizey,sizeof(short),1,fd)) {
        perror("Erreur lors de l'ecriture de sizey ");
        exit(EXIT_FAILURE);
      }
     if(!fread( &z->foodSpawnfreq, sizeof(short),1,fd)) {
        perror("Erreur lors de l'ecriture de foodSpawnfreq ");
        exit(EXIT_FAILURE);
      }
       if(!fread( &z->foodUnit, sizeof(short),1,fd)) {
        perror("Erreur lors de l'ecriture de foodUnit ");
        exit(EXIT_FAILURE);
      }
       if(!fread( &z->sourceFood, sizeof(short),1,fd)) {
        perror("Erreur lors de l'ecriture de sourceFood ");
        exit(EXIT_FAILURE);
      }
     
      z->cases = malloc(sizeof(Case)*z->sizex * z->sizey);
    printf("%d",z->sizex * z->sizey);
     
    int i=0;
    for(i=0;i< (z->sizex * z->sizey);i++)
    {
      char typebibite;
      char typeFourmi;
      short nbTypeFourmis;
     
     
     
     
     
     Case*   c = &z->cases[i];
     
     
    	if(fread( &c->obstacle, sizeof(char),1,fd) == -1) {
    	    perror("Erreur lors de l'ecriture de obstacle ");
    	    exit(EXIT_FAILURE);
    	  }
     
    	  printf("%d::%d\n",c->obstacle,i);
     
    	if(fread( &typebibite, sizeof(char),1,fd) == -1) {
    	    perror("Erreur lors de l'ecriture du type ");
    	    exit(EXIT_FAILURE);
    	  }
     
    	  if(fread( &typeFourmi,sizeof(char),1,fd) == -1) {
    		    perror("Erreur lors de l'ecriture de type ");
     
    		    exit(EXIT_FAILURE);
    		  }
     
        if(fread( &nbTypeFourmis, sizeof(short),1,fd) == -1) {
    		    perror("Erreur lors de l'ecriture de type ");
    		    exit(EXIT_FAILURE);
            }
     
     
    if(typebibite != -1)
    {
    		c->bibit =malloc(sizeof(bibite));
    		bibite* b = &c->bibit;
            b->type = typebibite;
     
    }
     
     
     
     
     
    if(typeFourmi != -1)
    {
            c->fourmi = malloc(sizeof(fourmis));
    	   fourmis* f = c->fourmi;
            f->type = typeFourmi;
    }
     
     
     
    	 if(nbTypeFourmis != -1)
    	 {
    	 if(typesfourmis == NULL)
    	 typesfourmis = loadTypeFourmis();
     
     
    	   c->fourmilier = creerFourmilier(nbTypeFourmis,typesfourmis);
    	   fourmiliere* f = c->fourmilier;
            f->nbTypeFourmis = nbTypeFourmis;
     
            int j=0;
    		  for(j=0;j<f->nbTypeFourmis;j++)
    		  {
    		   TypeFourmi *tf = f->typeFourmis[j];
     
     
                   if(fread( &f->probaSpawn[j], sizeof(float),1,fd) == -1) {
                    perror("Erreur lors de l'ecriture du type de fourmis ");
                    exit(EXIT_FAILURE);
                  }
     
    		  }
    	  }
     
    }
     
      fclose(fd);
      getchar();
     
     
    }
    Le contexte

    Chaque case doit être marqué dans un fichier en binaire les cases dans mon cas ont toujours leur fourmi NULL et leur bibite NULL , donc d'aprés ma fonction de sauvegarde on marque -1 dans le fichier ( j'ai tester avec un point d’arrêt)
    Seulement quand je charge les données avec ma fonction load pendant le chargement des cases j'obtiens pas toujours des -1.



    Je débute, et je suis dans incompréhension depuis hier. Merci d'avance

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    Si tu veux utiliser fread(), tu dois ouvrir un fichier en mode "rb" et non "r".
    De plus, dans ton save, pourquoi ouvrir le fichier en "ab+" si tu ne fais que des écritures? "ab" (voire même "wb" si c'est un overwrite complet que tu veux) suffirait...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Collégien
    Inscrit en
    Juin 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    D'accord , j'ai suivie tes conseils. Aucun changement, j'ai l'impression que tout est decalé , la variable obstacle a comme valeur ue typefourmi devrai avoir.

    Je ne comprend pas pourtant j'ecris bien dans le même ordre que je lis

  4. #4
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Bonjour,
    Les données écrites doivent avoir exactement la même taille en écriture et en lecture.
    Si un champ est "absent", il faut comme tu l'as fait enregistrer un token te permettant de détecter ce cas en lecture.
    Ce token doit :
    * être totalement distinguable de la valeur écrite, il vaut -1 dans ton cas.
    * avoir une taille bien identifiée
    * la lecture doit rester compatible donc doit lire exactement la longueur du token, ni plus ni moins si on est dans ce cas.
    Hors dans le code !
    * pour bibit, tout fait un octet (data écrite, token ecrit, data lue<=>token lu)
    * pour fourmi, cela n'est pas le cas! (data=1octet, token=2octets,...)
    Je suppose que les 2 variables nullvalue et numvalueshort valent -1.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Collégien
    Inscrit en
    Juin 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    En effet nullvalue est bien egal a -1 et c'est bien mon token.Par contre j'écris avec un sizeof(char) le soucis viens peut être de la ?

    Et oui je lis de la même façon que j'écris (même taille)

  6. #6
    Expert éminent
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 565
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 565
    Points : 7 648
    Points
    7 648
    Par défaut
    Ligne 92, il y a :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    else if(fwrite( &nullvalue,sizeof(short),1,fd) == -1) {
    Le sizeof est ok, -1 étant rempli de bits à 1, il peut être écrit en sizeof(char),sizeof(short) ou sizeof(int) et symétriquement lu comme un signed char,short ou int.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Collégien
    Inscrit en
    Juin 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Collégien
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2011
    Messages : 13
    Points : 11
    Points
    11
    Par défaut
    Du coup pour le moment aucune solution a mon probleme.

Discussions similaires

  1. les marges ne correspondent pas au document imprimé
    Par floyd973 dans le forum Mise en forme
    Réponses: 3
    Dernier message: 01/08/2014, 05h10
  2. Réponses: 4
    Dernier message: 21/04/2014, 13h52
  3. Réponses: 3
    Dernier message: 12/03/2009, 15h11
  4. Réponses: 5
    Dernier message: 22/10/2008, 17h40
  5. Réponses: 6
    Dernier message: 15/08/2008, 12h09

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