Rechercher : dans
Par :

Chargement ds un tableau de structure

Dernière réponse le 12 déc 2004 à 17:41:09 AndY, le 12 déc 2004 à 12:30:37 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « Chargement ds un tableau de structure » dans :
Tableaux HTML VoirUtilisation de tableaux Il est souvent utile de présenter des informations mieux structurées qu'avec des listes. Les tableaux permettent de les afficher en lignes et en colonnes. Les tableaux sont définis comme étant des suites de lignes. Un...
Les structures en langage C VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...
Les structures en langage C++ VoirDifférence entre une structure et un tableau Un tableau permet de regrouper des éléments de même type, c'est-à-dire codés sur le même nombre de bits et de la même façon. Toutefois, il est généralement utile de pouvoir rassembler des éléments de...

1

Ravachol, le 12 déc 2004 à 14:19:08

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)

Répondre à Ravachol

2

AndY, le 12 déc 2004 à 14:20:51

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;
};

Répondre à AndY

3

Ravachol, le 12 déc 2004 à 14:51:15

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)

Répondre à Ravachol

4

AndY, le 12 déc 2004 à 16:31:31

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...

:(

Répondre à AndY

5

Andy, le 12 déc 2004 à 16:49:14

=> sans les /* */ aussi ^^

Répondre à Andy

6

Ravachol, le 12 déc 2004 à 17:17:27

- 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)

Répondre à Ravachol

7

 AndY, le 12 déc 2004 à 17:41:09

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 :)

Répondre à AndY