[C] Problème d'attribution de valeurs
Haelle
-
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.
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.
A voir également:
- [C] Problème d'attribution de valeurs
- Excel liste de valeurs - Guide
- La valeur relative de 9 dans 295 700 est - Forum Excel
- Colombe souhaite utiliser cette image comme illustration. quel texte doit-elle ajouter pour attribuer correctement la photographie à son auteur ? votre réponse texte d’attribution : ✓ - Forum DHCP
- Cette valeur ne correspond pas aux restrictions de validation des données pour cette cellule ✓ - Forum Excel
- Quand on visite cette page, des messages sont échangés entre le navigateur et le site web. des extraits des messages échangés lors de la première connexion sont reproduits ci-dessous. des valeurs ont été remplacées par des numéros. retrouvez chacune de ces valeurs. - Forum Réseaux sociaux
13 réponses
réponse trouvée, il faut passer par atoi pour Speed et Poids, mais j'ai toujours pas trouvé pour Name
donne moi seulement la fonction ou tu remplire ton tableau du structure .
je peur t'aide
je peur t'aide
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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;
}
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;
}
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.
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 :
Ou alors si tu souhaites garder le pointeur, tu devras réaliser de l'allocation dynamique et copier avec strncpy.
Cdlt
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
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...
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...
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
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
Une solution simple serait de passer en C++ et d'utiliser le type string de la STL :D
string strName = "toto roxxor";
et hop^^
string strName = "toto roxxor";
et hop^^
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.
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.
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!
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!