Chargement ds un tableau de structure

Fermé
AndY - 12 déc. 2004 à 12:30
 AndY - 12 déc. 2004 à 17:41
Voila le "problème" :
Je veux charger les données à partir d'un fichier séquentiel dans un tableau de structures que j'ai alloué dynamiquement (malloc).

Voici ma fonctiond e chargement :

void chargement(struct s_dvd **ppt) //recoit un ptr de ptr afin de pouvoir travailler sur la structure dans le main
{
struct s_dvd dvd,*ptr; //s_dvd = ma structure définie en global
FILE *file;
file=fopen("dvd.txt","r");
if(file==NULL)
{
erreur(1); //affichage d'une erreur
}
else
{
*ppt=(struct s_dvd *)malloc(((ftell(file))/sizeof(struct s_dvd))*sizeof(struct s_dvd)); //allocation dynamique du tableau de structures
if (*ppt==NULL)
{
erreur(2);
}
else
{
ptr=*ppt; // ptr va pointer sur le debut de structure et va etre utilisé pr le chargement - *ppt ne bouge pas.
fseek(file,0,0);
while((fread(&dvd,sizeof(struct s_dvd),1,file))==1)
{
ptr->dvd_num=dvd.dvd_num;
ptr->dvd_titre=dvd.dvd_titre;
ptr->dvd_annee=dvd.dvd_annee;
ptr->dvd_realisateur=dvd.dvd_realisateur;
ptr->dvd_acteur[1].acteur_nom=dvd.dvd_acteur[1].acteur_nom;
ptr->dvd_acteur[1].acteur_prenom=dvd.dvd_acteur[1].acteur_prenom;
ptr->dvd_acteur[2].acteur_nom=dvd.dvd_acteur[2].acteur_nom;
ptr->dvd_acteur[2].acteur_prenom=dvd.dvd_acteur[2].acteur_prenom;
ptr->dvd_acteur[3].acteur_nom=dvd.dvd_acteur[3].acteur_nom;
ptr->dvd_acteur[3].acteur_prenom=dvd.dvd_acteur[3].acteur_prenom;
ptr->dvd_code=dvd.dvd_code;
ptr->dvd_duree=dvd.dvd_duree;
ptr++;

}
}
}
}



L'erreur : concerne toutes les données de type char[] : error C2106: '=' : left operand must be l-value

Si je commente les lignes concernées le chargement se fait correctement pr les int.

Que dois je modifier ?

Merci

7 réponses

Ravachol Messages postés 560 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 120
12 déc. 2004 à 14:19
Salut,
Te serais t-il possible de poster la définition de ta structure s_dvd ?

A++

C'est pas parce qu'ils sont nombreux à avoir tort
qu'ils ont raison! (COLUCHE)
0
bien sur la voila :

struct s_acteur
{
char acteur_nom[20];
char acteur_prenom[20];
};

struct s_dvd
{
int dvd_num;
char dvd_titre[30];
int dvd_annee;
char dvd_realisateur[30];
struct s_acteur dvd_acteur[3];
char dvd_code;
int dvd_duree;
};
0
Ravachol Messages postés 560 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 120
12 déc. 2004 à 14:51
Fais un essai en remplacant les affectations sur le char[] par
  strcpy(ptr->dvd_acteur[0].acteur_nom, "nom acteur");

En faisant gaffe à ce que la destination soit capable d'accèpter le nombre de caractère contenus dans la source ;-) Sinon il y a la fonction strncpy qui prend un taille max en paramètre.

A++

C'est pas parce qu'ils sont nombreux à avoir tort
qu'ils ont raison! (COLUCHE)
0
j'ai changé ma boucle while de ma focntion en ceci :

while((fread(&dvd,sizeof(struct s_dvd),1,file))==1)
{
ptr->dvd_num=dvd.dvd_num;
strcpy(ptr->dvd_titre,dvd.dvd_titre);
ptr->dvd_annee=dvd.dvd_annee;
strcpy(ptr->dvd_realisateur,dvd.dvd_realisateur);
/* strcpy(ptr->dvd_acteur[1].acteur_nom,dvd.dvd_acteur[1].acteur_nom);
strcpy(ptr->dvd_acteur[1].acteur_prenom,dvd.dvd_acteur[1].acteur_prenom);
strcpy(ptr->dvd_acteur[2].acteur_nom,dvd.dvd_acteur[2].acteur_nom);
strcpy(ptr->dvd_acteur[2].acteur_prenom,dvd.dvd_acteur[2].acteur_prenom);
strcpy(ptr->dvd_acteur[3].acteur_nom,dvd.dvd_acteur[3].acteur_nom);
strcpy(ptr->dvd_acteur[3].acteur_prenom,dvd.dvd_acteur[3].acteur_prenom);*/
ptr->dvd_code=dvd.dvd_code;
ptr->dvd_duree=dvd.dvd_duree;
ptr++;

}

avec les strcpy donc.

Pas de probleme a la compilation, mais a l'exécution... pour le premier DVD il affiche bien les format int, il affiche bien dvd_titre mais le reste rien du tout :/ et mon pc fait "bip bip bip bip bip". Quand aux dvd suivants rien ne s'affiche correctement ormis les format int...

:(
0

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

Posez votre question
=> sans les /* */ aussi ^^
0
Ravachol Messages postés 560 Date d'inscription vendredi 5 mars 2004 Statut Membre Dernière intervention 30 octobre 2005 120
12 déc. 2004 à 17:17
- As-tu vérifié le format des données dans le fichier que tu vas lire ?
- Qui écrit les données dans ce fichier ?
- Si c'est toi qui écris dedans, la fonction d'écriture est-elle débugée ?
- La taille mémoire que tu alloues avec malloc est-elle correcte ?
Pour éliminer cette hypothèse d'erreur tu pourrais allouer pour 2 structures par exemple en faisant un malloc(2*sizeof(struct s_dvd))
- As tu tracé les instructions dans ta boucle, par exemple au lieu de faire une affectation tu fais un printf("%s \n", dvd.dvd_acteur[1].acteur_nom). Ca te permettras de vérifier que tu récupères des données correctes depuis ton fichier.

A++

C'est pas parce qu'ils sont nombreux à avoir tort
qu'ils ont raison! (COLUCHE)
0
le format des données est correct, c'est moi qui écris dans le meme programme via une autre fonction, et une "bête" lecture séquentielle ne pose aucun problème.

Concernant la taille allouée, je fais un petit calcul ( taille du fichier en octest / taille d'une structure s_dvd) = nombre d'enregistrement que je multiplie par le nmobre d'octets de ma structure, correct je pense .

J'ai fait un printf du nom de l'acteur 1 et bon en effet ya un probleme lol, jvais regarder ca :)
0