begin process at 2012 05 29 21:58:33
  Trouver un code source :
 
dans
 
Accueil > Forum > 

Archive C/C++

 > 

Archives

 > 

Fichier / Disque

 > 

Probleme de sauvegarde d'une structure dans un fichier binaire


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

Probleme de sauvegarde d'une structure dans un fichier binaire

dimanche 16 octobre 2005 à 21:57:35 | Probleme de sauvegarde d'une structure dans un fichier binaire

issoux

Bonsoir, voila j'encode des etudiants + matricule + cotes  (tous des champs d'une structure)

les cotes et les matricules sont sauvés correctement dans mon fichier en binaire et lors du chargement je sais les relires ( apres ouverture en lecture du fichier)

Seul les champs "nom" de ma structure  ne s'affichent pas, apparemment ils sauvent les adresses de mes champs et non pas leur valeurs. Car au moment du chargement en lecture de mon fichier et que j'essaie d'afficher tous les noms d'etudiants, il m'affiche des symboles ou des données qui se trouve qqpart en mémoire .

Oui car je travail en dynamique ,  Ma structure est définit comme ceci :   struct etu  { int mat;
                                                                                                                               char *nom;
                                                                                                                                int *tab_cotes;

                                                                                                                              }

Ne me demander pas (svp) pourquoi je ne travail pas avec des limites statiques pour le champs non c'est la volonté de mon professeur


D'avence merci pour votre aide .... 
dimanche 16 octobre 2005 à 22:10:10 | Re : Probleme de sauvegarde d'une structure dans un fichier binaire

BruNews

Administrateur CodeS-SourceS
ben oui c'est clair si tu enregistres des adresses, faudrait qu'ensuite la liste des noms soit rechargée à la même adresse sinon tu obtiens nimporte quoi.

ciao...
BruNews, MVP VC++
dimanche 16 octobre 2005 à 22:26:23 | Re : Probleme de sauvegarde d'une structure dans un fichier binaire

issoux

Oui ca je l'ai bien compris mon erreur, mais comment sauver mes données( champs nom de l'étudiant uniquement) et non pas l'emplacement mémoire où ils se trouvent au moment de l'encodage.


Encore merci .
dimanche 16 octobre 2005 à 22:39:03 | Re : Probleme de sauvegarde d'une structure dans un fichier binaire

BruNews

Administrateur CodeS-SourceS
faudrait un
char nom[48]; par exemple
au lieu du pointeur

ciao...
BruNews, MVP VC++
dimanche 16 octobre 2005 à 23:09:31 | Re : Probleme de sauvegarde d'une structure dans un fichier binaire

issoux

Oui ca fonctionne directement ainsi mais toutefois, avec un pointeur sur char ce n'est pas possible ???

Pour vraiment attribuer juste ce qu'il faut en octets pour chaque nom

Parce que créer un char nom[25] , pour toto, y'aura 20 octets inutilisés ...

Je voulais au départ, faire un "strlen" de ma chaine et ensuite

-> p->nom=(char*) malloc (lg*sizeof(char));

et sauvé ainsi la valeur pointé par ce champ de structure et non pas son emplacement en mémoire à ce moment là

Désolé si je  persiste à vouloir rester dans  cette structure -ci mais c'etait au départ mon énoncé, donc j'aimerais pouvoir terminer de cette facon...

Merci en tous cas .
dimanche 16 octobre 2005 à 23:19:54 | Re : Probleme de sauvegarde d'une structure dans un fichier binaire

BruNews

Administrateur CodeS-SourceS
Réponse acceptée !
Mais on ne peut pas stocker des pointeurs, quand tu reliras le fichier les adresses pointées seront assurément invalides.
Tu peux écrire le nom comme tu dis sans structure fixe mais faudra un indicateur de longueur devant sinon la relecture du fichier sera hyper longue pour parser la fin des noms, il sera dans tous les cas impossible de relire avec ta structure actuelle.

ciao...
BruNews, MVP VC++
dimanche 16 octobre 2005 à 23:21:15 | Re : Probleme de sauvegarde d'une structure dans un fichier binaire

stegano

Membre Club
tu peu tjr faire un strlen sur un tableau .... strlen(nom)
dimanche 16 octobre 2005 à 23:24:45 | Re : Probleme de sauvegarde d'une structure dans un fichier binaire

stegano

Membre Club
Il faut savoir qu'un tableau est un pointeur permanent &nom[1] = nom+1 (je voulais juste faire une precision à ma réponse précédente
lundi 17 octobre 2005 à 00:45:36 | Re : Probleme de sauvegarde d'une structure dans un fichier binaire

issoux

Merci beaucoup je suis rassuré


Bonne soirée
lundi 17 octobre 2005 à 02:40:55 | Re : Probleme de sauvegarde d'une structure dans un fichier binaire

issoux

A fluut j'ai parlé un peu trop vite, apparemment il est impossible de sauver des champs de structure de tye pointeur( dûmoins pas leur valeurs)dans un fichier binaire ?!

Dés que je rend tout statique y'a pas de probleme... Voila mon code
[code]#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <alloc.h>
#include<string.h>
#include<ctype.h>

#define file "c:\\exo_malloc"

struct etu

            { int mat;

              char nom[25];

              int nbcotes;
              int *tab_cotes;

            };


int recherche_etu (void)

{ FILE *f;
  struct etu *p=NULL;
  char *matr=NULL;
  int mat=0;
  int i=0;
  int test=0;
  f=fopen(file,"rb");


  printf("             recherche donnée d\'un étudiant \n");
  printf("           ------------------------------------------\n");
  printf(" entrez le matricule de l\'etudiant rechercher \n");fgets(matr,sizeof matr,stdin);
  mat=atoi(matr);


  if (f)

          { while(fread(p,sizeof *p,1,f)>0)

               { if (p->mat==mat) { printf(" Nom : %s a encoder %d\n\n",p->nom,p->nbcotes);
                                    for (i=0;i<p->nbcotes;i++)

                                            { printf(" cote n°%d : %d/25\n",i+1,p->tab_cotes[i]);

                                            }


                                    test=1;
                                  }

               getch();
               }

          } // fin while

else
       { printf(" erreur à l\'ouverture du fichier \n");getch();

       }


if (test==0)
                { printf(" Ce matricule n\'existe pas \n");getch();

                }


fclose(f);
free(p);

return 0;

}


int charger_fichier (void)

{
   FILE*f;
   struct etu *p;

   f=fopen(file,"rb");
clrscr();


printf("            Liste des etudiants et leur matricule   \n");
printf("           ---------------------------------------  \n\n");


   if (f)

           { while (fread(p,sizeof (struct etu),1,f)>0)

                 {

                  printf("   matricule ->  psr%d   nom -> %s   \n",p->mat,p->nom);


                 }
                 getch();

           }

    else

          { printf(" erreur à l\'ouverture du fichier \n");
            getch();

          }
fclose(f);

clrscr();
return 0;

}

int save ( struct etu *p)

{ FILE *f;

f=fopen(file,"ab");

if (f)

         { fwrite(p,sizeof (struct etu),1,f);
         }

clrscr();

printf(" etudiant    Matricule  \n\n");
printf("  %s          psr%d      \n",p->nom,p->mat);

getch();


fclose(f);


return 0;

}


int encode (void)

{  struct etu *p;
   FILE *f;
   int i=0;
   char *matri=NULL;
   char *cote=NULL;
   char *nbcote=NULL;
   char c=NULL;
   int tmp=0;

 clrscr();

 f=fopen(file,"ab");

  if(!f)

         { printf(" erreur à l\'ouverture \n");

           getch();
         }

  else

      {
          do

            {   p=(struct etu *) malloc (sizeof(struct etu));


               printf(" Entrez matricule entre 1 et 25 \n");gets(matri);

               p->mat=atoi(matri);


        printf(" Entrez nom de l\'etudiant  :");gets(p->nom);


               printf(" entrez le nombres de cotes que vous voulez encoder : \n");gets(nbcote);

               p->nbcotes=atoi(nbcote);

               p->tab_cotes=(int*) malloc ((atoi(nbcote))*sizeof(int));

         tmp=atoi(nbcote);

        for (i=0;i<tmp;i++)

                         { printf(" cote n°%d -> \n",i+1);gets(cote);

                           (*p).tab_cotes[i]=atoi(cote);

                         }

        getch();

               save(p);

               free(p);

             printf(" Voulez encoder un nouvel etudiant ? \n");c=toupper(getch());


             } // fin while
             while (c=='O');

      } // fin else


fclose(f);

return 0;

}

int main ()

{
clrscr();

 // remove(file);

 //encode();

recherche_etu();


charger_fichier ();

return 0;

}
[/code]


Tu dis que je dois ecrire la longueur du nom avant le champs "nom ", oui mais le nom dont tu parle serait de quel type ?? pointeur sur char?

Parce que je viens d'essayer ce que tu dis pour mon tableau de cotes
J'ai rajouter un champ nbcotes qui me dis combien de cotes j'ai .

Donc pendant le Fread, je fais une boucle for de 0 à p->nbcotes, et je lis le nombre mais il m'a sauvé les adresses et non pas les valeurs donc ca pointe n'importe où comme tu dis...

Je comprend pas pourquoi le prof nous demanderais de le faire ainsi si cela ne fonctionne pas, au cours, il nous mettais en garde de ne pas sauver les adresses mais bien les valeurs ... .

Je ne comprend plus rien, et je n'ai cours que Jeudi !!!

Un grand merci pour votre aide !!!


1 2

Cette discussion est classée dans : fichier, binaire, champs, structure, cotes


Répondre à ce message

Sujets en rapport avec ce message

fichier binaire [ par stivi_45 ] Bonjour a tous, j'ai une petite question, je travaille sur un fichier binaire en c.Je stocke des informations dans ce fichier avec une structure : typ utilisation des Fichiers binaire et texte [ par romca ] Salut à tous, j'ai un exercice à faire et je sais pas par ou le commencer.On décrit une structure avec de champs bien précis.Dans la première question Saut de ligne dans un fichier binaire/texte [ par Galmiza ] Salut,Quel est l'équivalent de "\n" et de "\t" en binaire. J'ai essayé 13 pour remplacer le "\n". Mais lorsque j'ouvre le fichier généré avec bloc-not nombre d'objets dans un fichier binaire [ par nierpa ] Bonjour à tous, je débute avec les fichiers binaires (et en C++ en général) et j'aimerais savoir s'il était possible de connaitre le nombre d'ojets co caractère --> binaire --> caractère [ par iam_myst ] bonjour à tous,     J'aimerais savoir s'il existe une fonction qui permet de transformer un caractère en sa valeur binaire. ( et inversement )   Je Convertir un fichier Binaire en Fichier Texte [ par brute ] bonjour a tous, J'ai un problème, j'aimerais convertir un fichier binaire en fichier texte ..... Quelqu'un sait comment faire ?? Please help me Lire TOUT les caractères d'un fichier binaire [ par harddisk ] Probleme de remplissage de structure [ par brute ] bonjour, Je dois lire un fichier de configuration (.cng) et remplir différents champs d'une structure. Pour lire le fichier j'utilise un filestream e fichier binaire [ par niketou ] Salut a tous.J'ai un petit probleme je voudrais recuperer une donnee dans le fichier:void ReadMe(){char bu[1]; ifstream g;g.open("data.dat",ios::in, i Besoin d'une astuce :) [ par lamoueste ] Alors voila j'ai un probleme, je dois ouvrir un fichier binaire et le mettre en format txt : pour cela je dois convertir les octets tirés du fichier b


Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,555 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales