N'oublie pas de vérifier si fopen a bien pu ouvrir le fichier (if (fp == NULL) { /* erreur */ }).
while(fgets(chaine, sizeof(chaine), fp)) {
Faire un while sur fgets est mieux que sur feof, mais ce n'est pas encore ça. Si une ligne du fichier fait plus de 254 caractères, tu auras des surprises... (voir http://linuxfr.org/comments/784745,1.html où j'en ai déjà parlé)
Il faut toujours tester les valeurs de retour des fonctions *scanf. Elles retournent le nombre de conversions effectuées avec succès. dans ton cas, si elle renvoie un nombre différent de 5, alors il y a une erreur. Par ailleurs, si une des deux premières chaînes fait plus de 19 caractères, tu obtiens un débordement de tampon, et donc un comportement indéfini. Vérifie dans la doc, mais il me semble que le bon format est %[20]s.
(s+i)->v = v;
C'est correct mais, pour des raisons de lisibilité, je préfère la notation s[i].v.
main() {
Non. int main(void). gcc autorise un type absent pour la fonction main, car il se base sur le C90, mais il faut préciser le type en mode C99.
struct enreg x[1000000]; // cree la structure x
Ouch. 1000000 de fois environ 50 octets (en suposant une implémentation classique), ça fait 50 Mo sur la pile. Un peu gros. Ca compilera très probablement (peut-être avec un warning si le compilo n'est pas trop mauvais), mais ce n'est pas garanti que ça marche à l'exécution. Utilise plutôt une allocation dynamique avec malloc.
[^] # Re: base de la programmation
Posté par alf . En réponse au message Question pour C gourou !. Évalué à 2.
#include <stdio.h> struct enreg { /* ... */ }; void fct(struct enreg *s) { char chaine[256], date[20], heure[20]; int v; float a,b,c,d; int i=0; FILE *fp = fopen("1.txt", "r");N'oublie pas de vérifier si fopen a bien pu ouvrir le fichier (if (fp == NULL) { /* erreur */ }).while(fgets(chaine, sizeof(chaine), fp)) {Faire un while sur fgets est mieux que sur feof, mais ce n'est pas encore ça. Si une ligne du fichier fait plus de 254 caractères, tu auras des surprises... (voir http://linuxfr.org/comments/784745,1.html où j'en ai déjà parlé) Il faut toujours tester les valeurs de retour des fonctions *scanf. Elles retournent le nombre de conversions effectuées avec succès. dans ton cas, si elle renvoie un nombre différent de 5, alors il y a une erreur. Par ailleurs, si une des deux premières chaînes fait plus de 19 caractères, tu obtiens un débordement de tampon, et donc un comportement indéfini. Vérifie dans la doc, mais il me semble que le bon format est %[20]s. C'est correct mais, pour des raisons de lisibilité, je préfère la notation s[i].v.main() {Non. int main(void). gcc autorise un type absent pour la fonction main, car il se base sur le C90, mais il faut préciser le type en mode C99. Ouch. 1000000 de fois environ 50 octets (en suposant une implémentation classique), ça fait 50 Mo sur la pile. Un peu gros. Ca compilera très probablement (peut-être avec un warning si le compilo n'est pas trop mauvais), mais ce n'est pas garanti que ça marche à l'exécution. Utilise plutôt une allocation dynamique avec malloc. Comme déjà dit, fct(x);.