Citation
mima
je voudrais savoir comment a partir d'une
structure erudiant nom prenom etc... on peut creer
un fichier contenant n etudiants puis afficher
leur nom prenom et moyenne
Citation
mima
merci g cree le tableau mai ca ne m'avance en rien
si je sai pas comment on le manipule pour creer le
fichier avec fprintf etc...
struct s_eleve { ....char nom[21]; ....char prenom[21]; ....double moyenne; };
struct s_eleve tabEleve[]={ ....{"Legrand", "Pierre", 12.5}, ....{"Ledur", "Paul", 13.5}, ....{"Lefort", "Roland", 7.5}, ....{NULL, NULL, 0} };
FILE *fp; struct s_eleve *ptEleve; fp=fopen("fichier", "w"); for (ptEleve=tabEleve; ptEleve->nom != NULL; ptEleve++) ....fprintf(fp, "%s:%s:%f\n",ptEleve->nom, ptEleve->prenom, ptEleve->moyenne); fclose(fp);
FILE *fp; int i; fp=fopen("fichier", "w"); for (i=0; tabEleve.nom != NULL; i++) ....fprintf(fp, "%s:%s:%f\n",tabEleve.nom, tabEleve.prenom, tabEleve.moyenne); fclose(fp);
Citation
nizar
utilise fwrite ca va être plus souple et plus simple pour la manipulation d'un tableau pour le stocker dans un fichier
Citation
Basile STARYNKEVITCH
...
En gros, pour un débutant, je conseille fprintf.
...
struct s_eleve { ....char nom[21]; ....char prenom[21]; ....double moyenne; };il n'y a que moyenne qui ne serait pas portable, et encore, j'utilise le conditionel à dessein: actuellement les types "virgule flottante" sont normalisés au niveau du matériel et peuvent souvent être repris tels quels (ce n'est pas, malheureusement, le cas des entiers). Dans le cas précis, la seule chose qui pourrait poser des problème de portabilité, c'est les bytes de "padding" mis pour aligner moyenne sur une frontière de mot. Pour pallier à cet inconvénient, il suffit de mettre moyenne au début de la structure, cela devrait suffire.
Citation
abgech
Tu parles de portabilité, c'est un point qui peut
se discuter. Avec la structure qui est proposée
plus haut:
struct s_eleve {
....char nom[21];
....char prenom[21];
....double moyenne;
};
il n'y a que moyenne qui ne serait pas portable,
et encore, j'utilise le conditionel à dessein:
actuellement les types "virgule flottante" sont
normalisés au niveau du matériel et peuvent
souvent être repris tels quels (ce n'est pas,
malheureusement, le cas des entiers). Dans le cas
précis, la seule chose qui pourrait poser des
problème de portabilité, c'est les bytes de
"padding" mis pour aligner moyenne sur une
frontière de mot. Pour pallier à cet inconvénient,
il suffit de mettre moyenne au début de la
structure, cela devrait suffire.
On classe, dans la structure, les types de données selon la taille de leur alignement, les plus grands alignements en premier, puis les autres: par exemple:Citation
Sve@r
...
Je trouve la solution dangereuse (que faire si on a plusieurs doubles et float ???).
...
AMHA, j'estime que cette solution, un peu "fouilli" va à l'encontre de la lisibilité du programme en multipliant les fwrite pour un seul accés logique.Citation
Sve@r
...
il vaut mieux utiliser un fwrite par membre plutôt qu'un fwrite pour la structure entière.
...
struct coord_s {double x, double y } point;
fwrite(point, sizeof(point), 1,fp);
fwrite(point.x, sizeof(point.x), 1,fp); fwrite(point.y, sizeof(point.y), 1,fp);
Citation
abgech
AMHA, j'estime que cette solution, un peu
"fouilli" va à l'encontre de la lisibilité du
programme en multipliant les fwrite pour un seul
accés logique.
Par exemple, imagine:
struct coord_s {double x,
double y
} point;
fwrite(point, sizeof(point), 1,fp);
Me paraît plus clair que:
fwrite(point.x, sizeof(point.x), 1,fp);
fwrite(point.y, sizeof(point.y), 1,fp);
Et encore, je n'ai mis que deux variables dans ma
structure. Imagine s'il y en a une dizaine, cas
fréquent des structures !