Boucle infini pendant lecture dans un fichier
Bonjour
alors, voici mon probleme :
Je dois lire dans un fichier une liste de 4 parametres, nom, prenom, age, et secu.
le fichier est ecrit comme suit :
nom1
prenom1
age1
secu1
nom2
prenom2
etc ..
Afin de pouvoir afficher ces parametres, j'effectue une recherche avec le nom.
alors voila le code, de recherche :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
|
void visu (char *anu_secu)
{
FILE *fp;
printf("Nom desire\t: ");
scanf("%s",&(tmp.nom));
fflush;
puts ("ouverture du fichier en cours..");
fp=fopen (anu_secu,"r");
fseek (fp,0,SEEK_SET);
//RECHERCHE
while (tmp.nom != st.nom) {
fscanf (fp,"%[^\n]\n",&(st.nom));
getchar();
fscanf (fp,"%[^\n]\n",&tmp.prenom);
fscanf (fp,"%[^\n]\n",&tmp.age);
fscanf (fp,"%[^\n]\n",&tmp.secu);
}
} |
Alors, le pointeur vers le fichier (anu_secu) marche bien, il trouve le fichier.
Les valeurs st.nom, et tmp.nom, font reference a des structures declare en variables generales.
Donc je fait la voucle tant que le nom rentre au clavier est different de celui inscrit dans le fichier.
J'ai verifie avec des printfs que les noms etait bien selectionnes, c'est le cas, mais meme, lorsqu'il correspondent, la boucle continue.
donc je vois pas ou se situe mon probleme.
Merci de votre aide.
Re: Boucle infini pendant lecture dans un fichier
Code:
scanf("%s",&(tmp.nom));
Double erreur (pas de limite de buffer -->utiliser fgets() et il faut passer tmp.nom sans en donner l'adresse (enfin je suppose que nom est un tableau de caractères, comment veux-tu qu'on t'aide alors qu'il manque définitions et déclarations... :roll: ))
ce truc ne fait absolument rien... Au passage, fflush(stdin) n'est pas standard, et n'est garenti marcher que sous DOS et Windows
Code:
1 2
| fp=fopen (anu_secu,"r");
fseek (fp,0,SEEK_SET); |
Où est la vérification que fp!=NULL ?
Code:
while (tmp.nom != st.nom) {
On ne compare pas deux chaînes ainsi en C... il faut utiliser strcmp()
Code:
1 2 3 4 5 6 7
| fscanf (fp,"%[^\n]\n",&(st.nom));
getchar();
fscanf (fp,"%[^\n]\n",&tmp.prenom);
fscanf (fp,"%[^\n]\n",&tmp.age);
fscanf (fp,"%[^\n]\n",&tmp.secu);
}
} |
Mêmes erreurs avec scanf()...
Re: Boucle infini pendant lecture dans un fichier
Citation:
Envoyé par Médinoc
Code:
1 2 3 4 5 6 7
| fscanf (fp,"%[^\n]\n",&(st.nom));
getchar();
fscanf (fp,"%[^\n]\n",&tmp.prenom);
fscanf (fp,"%[^\n]\n",&tmp.age);
fscanf (fp,"%[^\n]\n",&tmp.secu);
}
} |
Mêmes erreurs avec scanf()...
Et il manque un test de la fin de lecture sur les fonctions de lecture...
Bref, ce code est une catastrophe...
Re: Boucle infini pendant lecture dans un fichier
Citation:
Envoyé par Médinoc
Code:
scanf("%s",&(tmp.nom));
Double erreur (pas de limite de buffer -->utiliser fgets() et il faut passer tmp.nom sans en donner l'adresse (enfin je suppose que nom est un tableau de caractères, comment veux-tu qu'on t'aide alors qu'il manque définitions et déclarations... :roll: ))
Desolé, j'ai completement oublie de rajouter la declaration de ma structure. Effectivement nom, est un tableau de charactere.
Avant d utiliser scanf, j'utilisais gets(tmp.nom) mais au moment de la compilation il me disait qu'il vallait mieux pas l'utiliser (compilation avec gcc4)
Citation:
Envoyé par Médinoc
ce truc ne fait absolument rien... Au passage, fflush(stdin) n'est pas standard, et n'est garenti marcher que sous DOS et Windows
Au depart j'avais mis flushall, mais comme la libraire conio.h etait introuvable sous linux (autre parametre que j'ai homis d'iniquer), j'ai du cherche quelque chose d'autre, et j'avais trouve ca.
Citation:
Envoyé par Médinoc
Code:
1 2
| fp=fopen (anu_secu,"r");
fseek (fp,0,SEEK_SET); |
Où est la vérification que fp!=NULL ?
Il etait dans une autre fonction anterieur dans l'execution a cette boucle.
Citation:
Envoyé par Médinoc
Code:
while (tmp.nom != st.nom) {
On ne compare pas deux chaînes ainsi en C... il faut utiliser strcmp()
Ah, ok, c'est donc pour ca qu'il trouve jamais. merci.
Citation:
Envoyé par Médinoc
Code:
1 2 3 4 5 6 7
| fscanf (fp,"%[^\n]\n",&(st.nom));
getchar();
fscanf (fp,"%[^\n]\n",&tmp.prenom);
fscanf (fp,"%[^\n]\n",&tmp.age);
fscanf (fp,"%[^\n]\n",&tmp.secu);
}
} |
Mêmes erreurs avec scanf()...
ok, je vais essayer avec fgets, mais est ce que fgets pourra lire les entiers?
Re: Boucle infini pendant lecture dans un fichier
Citation:
Envoyé par Emmanuel Delahaye
Citation:
Envoyé par Médinoc
Code:
1 2 3 4 5 6 7
| fscanf (fp,"%[^\n]\n",&(st.nom));
getchar();
fscanf (fp,"%[^\n]\n",&tmp.prenom);
fscanf (fp,"%[^\n]\n",&tmp.age);
fscanf (fp,"%[^\n]\n",&tmp.secu);
}
} |
Mêmes erreurs avec scanf()...
Et il manque un test de la fin de lecture sur les fonctions de lecture...
Bref, ce code est une catastrophe...
Ah, ca, que le code soit une catastrophe, est une chose sure, mais comme je debute, j'espere que tu pardonneras ces erreures nombreuses
Un test de fin de lecture? Je dois lui dire que lire la ligne jusqu'a rencontrer un caractere de fin de chaine c'est ca?
Re: Boucle infini pendant lecture dans un fichier
Citation:
Envoyé par beware
Desolé, j'ai completement oublie de rajouter la declaration de ma structure. Effectivement nom, est un tableau de charactere.
Donc, tmp.nom suffit, &(tmp.nom) est est mauvais.
Citation:
Avant d utiliser scanf, j'utilisais gets(tmp.nom) mais au moment de la compilation il me disait qu'il vallait mieux pas l'utiliser (compilation avec gcc4)
Il ne faut pas utiliser gets() nom plus: utilise fgets().
Citation:
Au depart j'avais mis flushall, mais comme la libraire conio.h etait introuvable sous linux (autre parametre que j'ai homis d'iniquer), j'ai du cherche quelque chose d'autre, et j'avais trouve ca.
Il n'y a rien de standard pour vider le buffer d'entrée d'un terminal (parce qu'il n'y a rien en standard pour vérifier que c'est bien un terminal et non pas un fichier)
Citation:
Citation:
Envoyé par Médinoc
Où est la vérification que fp!=NULL ?
Il etait dans une autre fonction anterieur dans l'execution a cette boucle.
??? :?: ???
Il faut Toujours tester le résultat d'une fonction comme fopen() ou malloc(), même si le dernier appel a marché. Il peut toujours se passer quelque chose.
Citation:
ok, je vais essayer avec fgets, mais est ce que fgets pourra lire les entiers?
Pour l'instant, tu ne lisais pas d'entiers de toute façon, mais des chaînes.
Le plus facile et le plus sûr, c'est de lire une chaîne avec fgets() et en extraire le nombre avec strtol() ou strtod().
Re: Boucle infini pendant lecture dans un fichier
Citation:
Envoyé par Médinoc
Donc, tmp.nom suffit, &(tmp.nom) est est mauvais.
Ok, je change ca alors.
Citation:
Il ne faut pas utiliser gets() nom plus: utilise fgets().
Je croyais que fgets ne servait que pour lire dans un fichier, or dans le cas :
Code:
1 2
| printf("Nom desire\t: ");
scanf("%s",&(tmp.nom)); |
il s'agit d acquerir une valeur entree au clavier.
Citation:
Il n'y a rien de standard pour vider le buffer d'entrée d'un terminal (parce qu'il n'y a rien en standard pour vérifier que c'est bien un terminal et non pas un fichier)
Citation:
Citation:
Envoyé par Médinoc
Où est la vérification que fp!=NULL ?
Il etait dans une autre fonction anterieur dans l'execution a cette boucle.
??? :?: ???
Il faut
Toujours tester le résultat d'une fonction comme fopen() ou malloc(), même si le dernier appel a marché. Il peut toujours se passer quelque chose.
Ok, merci je savais pas.
Citation:
ok, je vais essayer avec fgets, mais est ce que fgets pourra lire les entiers?
Pour l'instant, tu ne lisais pas d'entiers de toute façon, mais des chaînes.
Le plus facile et le plus sûr, c'est de lire une chaîne avec fgets() et en extraire le nombre avec strtol() ou strtod().[/quote]
Ok, merci du tuyau