[C] Problème d'attribution de valeurs

Haelle -  
 Haelle -
Bonjour,
j'ai un soucis en C, j'ai créer une structure assez simple,
struct Cowboy {
char* Name;
int Poids;
int Speed;
};

et j'ai un programme qui parcours un fichiers .txt et qui remplis mon talbeau de structure seulement il le remplit n'importe comment, il a l'air de mettre les adresses et pas le contenu: (end c'est la taille max du tableau)
struct Cowboy *read(int end){
FILE *fichier;
fichier=fopen("cowboys.txt","r" );
int i;

struct Cowboy *l=(struct Cowboy*)calloc(end,sizeof(struct Cowboy));

for (i=0; i<end; i++)
{
char a[100];
fgets(a, sizeof a,fichier);
l[i].Name=a;

int b;
fgets(b, sizeof b,fichier);
l[i].Poids=b;

int c;
fgets(c,sizeof c,fichier);
l[i].Speed=c;
}
return l;
}

voilà le contenu de cowboys.txt:
lukcy luke
50
30
Joe
45
25

je teste tout ca avec un programme qui affiche le contenu d'un tableau de struct Cowboy:
void affiche(struct Cowboy l[], int end){
int i;
for (i=0; i<end; i++)
{
printf("nom: %s\n",l[i].Name);
printf("poids: %d\n",l[i].Poids);
printf("vitesse: %d\n",l[i].Speed);
}
printf("\n\n" );
}

et voilà la fonction main... (au début c'est pour tester la fonction affiche qui à l'air d'être correcte)
int main(){
struct Cowboy m[2];
m[0].Name="totototototototti";
m[0].Poids=65;
m[0].Speed=35;
m[1].Name="titi";
m[1].Poids=75;
m[1].Speed=20;

affiche(m,2);
system("PAUSE" );
affiche(read(2),2);

printf("end\n" );
system("PAUSE" );
return 0;
}

merci par avance des réponses que vous pourriez m'apporter.
Et je ne suis même pas sur que le programme avance dans le fichier, j'ai peur qu'il stagne à la première ligne.

13 réponses

Haelle
 
réponse trouvée, il faut passer par atoi pour Speed et Poids, mais j'ai toujours pas trouvé pour Name
0
sadektlili Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   4
 
donne moi seulement la fonction ou tu remplire ton tableau du structure .
je peur t'aide
0
Haelle
 
struct Cowboy *read(int end){
FILE *fichier;
fichier=fopen("cowboys.txt","r" );
int i;

struct Cowboy *l=(struct Cowboy*)calloc(end,sizeof(struct Cowboy));

for (i=0; i<end; i++)
{
char a[100];
fgets(a, sizeof a,fichier);
l[i].Name=a;

char b[100];
fgets(b, sizeof b,fichier);
int bb=atoi(b);
l[i].Poids=bb;

char c[100];
fgets(c,sizeof c,fichier);
int cc=atoi(c);
l[i].Speed=cc;
}
return l;
}

voilà, tout à l'air de fonctionner, mais dans la fonction affiche lorsque je lui met en paramère read(2) les noms sont:
dvn: h
merci
0
sadektlili Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   4
 
laisse moi du temp pour voir ca .15min.....;;
0
sadektlili Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   4
 
donne moi une exp sur la stcture de ton ficher ..
0
Haelle
 
alors en fait le fichier que l'on ouvre est de la forme:
lucky luke
70
40
Joe dalton
60
35

ma structure est faite en adéquation avec:
struct Cowboy {
char* Name;
int Poids;
int Speed;
};
0

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

Posez votre question
sadektlili Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   4
 
struct Cowboy *read(int end){
FILE *fichier;
fichier=fopen("cowboys.txt","r" );
int i;
char a[100];
struct Cowboy *l=(struct Cowboy*)calloc(end,sizeof(struct Cowboy));

for (i=0; i<end; i++)
{


fgets(a, sizeof a,fichier);
sscanf(a,"%s",l[i].nam);


fgets(a, 5,fichier);
sscanf(a,"%d",&l[i].Poids);


fgets(c,5,fichier);
sscanf(a,"%d",&l[i].Speed);
}
return l;
}
0
Haelle
 
hum j'ai le droit à un beau segmentation fault quand le prog arrive à la boucle for (il compile tout de meme)
je cherche pourquoi, il faut aussi que je regarde comment fonctionne sscanf
0
Haelle > Haelle
 
bonne nouvelle ce que tu m'as donné à l'air de fonctionner mais c'est ma fonction affiche qui envoie le seg fault en fait, je cherche pourquoi
déjà merci un bon pb de résolu
0
sadektlili Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   4
 
laisse moi du temp pour compiler ton programme
0
sadektlili Messages postés 139 Date d'inscription   Statut Membre Dernière intervention   4
 
pour tu a utiliser la fionction "atoi(b)"
0
Haelle
 
j'ai utilisé atoi sur b et c pour les convertir en int,
là j'ai un autre problème à la fin de la boucle j'ai ajouté
printf("%s\n%d\n%d\n",l[i].Name,l[i].Poids,l[i].Speed);
pour voir si le contenu est bon mais en ajoutant ca ca plante...
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Salut
Oui, il faut utiliser atoi (ou strtol), ou pourquoi pas sscanf("%d", ...);
Sinon pour la chaîne, il y a en effet un problème. Tu as une structure dans laquelle tu mets un pointeur.
Lors de la première itération tu fais pointer ce pointeur vers a.
char a[100];
fgets(a, sizeof a,fichier);
l[i].Name=a; 

Donc, à chaque itération, lorsque tu changeras a, le champ Name de ta structure changera également.
Il faudrait mieux mettre un char Name[100] dans ta structure au lieu de char*.
Et ensuite faire :
fgets(I[a].Name,sizeof I[a].Name,stdin);

Ou alors si tu souhaites garder le pointeur, tu devras réaliser de l'allocation dynamique et copier avec strncpy.
Cdlt
0
Haelle
 
pour char Name[100], c'était mon idée initiale mais ensuite lors d'une affectation simple ( l[0].Name[100]="toto"; ) si j'affiche le contenu je vois @| ou des truc du genre... c'est pourquoi j'ai opté pour char* car j'ai pas trouvé comment résoudre ce problème.

dans ton fgets tu voulais plutot dire:
fgets(l[i].Name, sizeof l[i].Name,fichier);
je ne peux pas faire du stdin c'est justement là mon pb.

et pour strncpy j'ai pas réussit à le faire fonctionner... pb de paramètre...
0
Haelle > Haelle
 
je vous remercie de votre aide, tout fonctionne ou presque, je m'explique
le programme fonctionne comme je le souhaite mais
int main(){
struct Cowboy m[2];
m[0].Name[10]="toto";
m[0].Poids=65;
m[0].Speed=35;
m[1].Name[10]="titi";
m[1].Poids=75;
m[1].Speed=20;

affiche(m,2);

printf("end\n");
system("PAUSE");
return 0;
}
affiche(m,2); mets des truc bizarre dans les noms alors que si je fais affiche(read(2),2); lui fonctionne très bien
encore merci :p
0
legulysse Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   15
 
Une solution simple serait de passer en C++ et d'utiliser le type string de la STL :D

string strName = "toto roxxor";

et hop^^
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Pour copier, utilise plutôt :
strncpy(l[i].Name,"coucou",sizeof l[i].Name);
0
Haelle
 
hum j'ai un autre soucis, ma fonction read renvoie l (return l), mais dans ma fonction main si je fais
affiche(read(2),2);
ca plante, je pense que la portée de l n'est pas suffisante malgrès mon malloc...
j'aimerai recupérer la liste pour la remanipuler dans mon main en fait...
0
legulysse Messages postés 121 Date d'inscription   Statut Membre Dernière intervention   15
 
Peut être qu'en la déclarant dans ton main ce sera suffisant ?
0
fiddy Messages postés 11069 Date d'inscription   Statut Contributeur Dernière intervention   1 846
 
Il y a peut-être une erreur dans ta fonction. Comme je ne la vois pas, je peux pas te dire.
Il faudrait que tu postes ton code en entier en enlevant tout ce qui n'est pas nécessaire.
Et surtout, n'oublie pas de l'encapsuler dans des balises (code) à droite de sougliner) pour que ça soit lisible.
0
Haelle
 
oki je vais le poster, ca va pas être facile de rédiger ça correctement, j'ai quand même pas mal de fichiers.
je vais le retravailler pour enlever les étapes inutiles (intro...)
0
Haelle
 
Ne t'ennuie pas à lire mon code, j'ai trouvé d'ou venait l'erreur j'avais mal rédiger un return dans la fonction initiale lancement(N) (pas recopiée ici), je m'étais trop concentré sur read et les autres... c'est en voulant simplifier pour le forum que j'ai vu que ça fonctionnait sans lancement(N), j'ai jeté un coup d'oeil et hop miracle l'erreur m'est apparue!!
Merci :p
Voici quand même le code si tu es courageux!

#include <stdio.h>
#include <stdlib.h>

struct Cowboy {
char Name[100];
int Poids;
int Speed;
};


void affiche(struct Cowboy *l, int end){
int i;
for (i=0; i<end; i++)
{
printf("nom: %s\n",l[i].Name);
printf("poids: %d\n",l[i].Poids);
printf("vitesse: %d\n",l[i].Speed);
printf("\n\n");
}
printf("\n\n");
}

struct Cowboy *read(int end){
// Choix et ouverture du fichier:
FILE *fichier;
char fi[100];
do
{
printf("taper le nom du fichier a ouvrir:\n");
scanf("%s",&fi);
fichier=fopen(fi,"r");
} while (fichier==NULL);


int i;
char a[100];
struct Cowboy *l=(struct Cowboy*)calloc(end,sizeof(struct Cowboy));

for (i=0; i<end; i++)
{

fgets(a, sizeof a,fichier);
sscanf(a,"%s",&l[i].Name);

fgets(a, sizeof a,fichier);
sscanf(a,"%d",&l[i].Poids);

fgets(a,sizeof a,fichier);
sscanf(a,"%d",&l[i].Speed);

}
affiche(l,2);
system("PAUSE");
fclose(fichier);
return l;
}

int main(int argc, char *argv[])
{
//Présentation

//définition de la constante "nombre de cowboys" que vous aller rentrer.
static const int N;
printf("Combien y a-t-il de Cowboys?\n");
scanf("%d",&N);
printf("il y aura %d Cowboys\n",N);

// ici je mets lancement(N); normalement
read(N);
affiche(read(N),N);


// suite du prog.
/*
.............
*/
printf("End Of Program\n");
system("PAUSE");
return 0;
}

encore merci!
0