Recup de donnée dans un fichier en C
Résolu
Rudyskate
-
lami20j Messages postés 21506 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
lami20j Messages postés 21506 Date d'inscription Statut Modérateur, Contributeur sécurité Dernière intervention -
Bonjour, j'aimerais avoir un petit peu d'aide pour mon programme en C.
Enfait mon problème est le suivant :
- je dois tout d'abord ouvrir un fichier texte pour y ecrire des choses dedans "fprintf", Pour ca tout va bien !!!
- Ensuite je doit afficher le contenu du fichier a l'ecran avec des "fscanf" et voila ou est mon probleme.
Quand j'affiche à l'écran mon fichier texte celui saute oubli des lignes de mon fichier. exemple:
* Dans mon fichier voitures.txt j'ai :
Opel Ascona 1981 E 650.00
Renault Megane 1999 D 1000.00
Peugeot 308 2005 D 1500.00
*je veux afficher mon fichier sous ette forme :
voiture : Opel
type: Ascona
année: 1981
Motorisation:Essence
Prix: 650 Euro
LE code fonctionne apparement tres bien "SAUF" qu'il m'affiche une voiture sur 2... genre Opel pis ensuite la Peugeot...
voici Mon code :
Enfait mon problème est le suivant :
- je dois tout d'abord ouvrir un fichier texte pour y ecrire des choses dedans "fprintf", Pour ca tout va bien !!!
- Ensuite je doit afficher le contenu du fichier a l'ecran avec des "fscanf" et voila ou est mon probleme.
Quand j'affiche à l'écran mon fichier texte celui saute oubli des lignes de mon fichier. exemple:
* Dans mon fichier voitures.txt j'ai :
Opel Ascona 1981 E 650.00
Renault Megane 1999 D 1000.00
Peugeot 308 2005 D 1500.00
*je veux afficher mon fichier sous ette forme :
voiture : Opel
type: Ascona
année: 1981
Motorisation:Essence
Prix: 650 Euro
LE code fonctionne apparement tres bien "SAUF" qu'il m'affiche une voiture sur 2... genre Opel pis ensuite la Peugeot...
voici Mon code :
void toutaffiche()
{
struct voitures voitvente[20];
int i;
int j;
FILE *v=NULL;
v=fopen("voitures.txt","r");
i=0;
do
{
fscanf(v, "%s", voitvente[i].marque);
fscanf(v, "%s", voitvente[i].type);
fscanf(v, "%d", &voitvente[i].annee);
fscanf(v, "%s", &voitvente[i].motorisation);
fscanf(v, "%f", &voitvente[i].prix);
i++;
}
while ( fscanf(v,"%s %s %d %s %f",voitvente[i].marque,voitvente[i].type,&voitvente[i].annee,&voitvente[i].motorisation,&voitvente[i].prix) != EOF);
for (j=0;j<i;j++)
{
printf("%d- Voiture : %s %s\n",j,voitvente[j].marque,voitvente[j].type);
printf("Annee : %d\n",voitvente[j].annee);
if (voitvente[j].motorisation =='D')
printf ("Motorisation : Diesel\n");
else if (voitvente[j].motorisation =='E')
printf ("Motorisation : Essence\n");
printf("Prix : %6.2f Euro\n\n\n\n",voitvente[j].prix);
}
fclose(v);
}Configuration: Windows Vista Firefox 3.0.6
9 réponses
-
Re,
do
{
fscanf(v, "%s", voitvente[i].marque);
fscanf(v, "%s", voitvente[i].type);
fscanf(v, "%d", &voitvente[i].annee);
fscanf(v, "%s", &voitvente[i].motorisation);
fscanf(v, "%f", &voitvente[i].prix);
i++;
}
while ( fscanf(v,"%s %s %d %s %f",voitvente[i].marque,voitvente[i].type,&voitvente[i].annee,&voitvente[i].motorisation,&voitvente[i].prix) != EOF);
Voici comment tu dois écrire ta boucle whilewhile ( fscanf(v,"%s%s%d%s%f", voitvente[i].marque,voitvente[i].type, &voitvente[i].annee,&voitvente[i].motorisation, &voitvente[i].prix) == 5) i++; -
-
Ouép bah sa ne marche toujours pas, le programme saute toujours une voiture. J'impression que le i++ incrémente ou que le curseur se trouve deja a la ligne de la voiture suivante j'en sais rien...
Si le curseur se trouve a la ligne de la voiture suivante le i++ sautera celle-ci non?
Quelqu'un d'autre aurait une idée ou si t'as une autre idée ??
Au fait pourquoi on met while( ......... == 5) ?
Merci -
Re,
Voici le code que j'ai utiliser#include<stdio.h> struct voitures{ char marque[50]; char type[50]; int annee; char motorisation; float prix; }; void toutaffiche(); int main() { toutaffiche(); return 0; } void toutaffiche() { struct voitures voitvente[20]; int i; int j; FILE *v=NULL; v=fopen("fic.txt","r"); i=0; while ( fscanf(v,"%s%s%d%s%f", voitvente[i].marque,voitvente[i].type, &voitvente[i].annee,&voitvente[i].motorisation, &voitvente[i].prix) == 5) i++; for (j=0;j<i;j++){ printf("%d- Voiture : %s %s\n",j,voitvente[j].marque,voitvente[j].type); printf("Annee : %d\n",voitvente[j].annee); if (voitvente[j].motorisation =='D') printf ("Motorisation : Diesel\n"); else if (voitvente[j].motorisation =='E') printf ("Motorisation : Essence\n"); printf("Prix : %6.2f Euro\n\n\n\n",voitvente[j].prix); } fclose(v); }voici le fichier de testlami20j@debian:~/trash$ cat fic.txt Opel Ascona 1981 E 650.00 Renault Megane 1999 D 1000.00 Peugeot 308 2005 D 1500.00
Voici la compilation et le résultatlami20j@debian:~/trash$ gcc ccm_afficher.c lami20j@debian:~/trash$ ./a.out 0- Voiture : Opel Ascona Annee : 1981 Motorisation : Essence Prix : 650.00 Euro 1- Voiture : Renault Megane Annee : 1999 Motorisation : Diesel Prix : 1000.00 Euro 2- Voiture : Peugeot 308 Annee : 2005 Motorisation : Diesel Prix : 1500.00 Euro
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
Re,
Au fait pourquoi on met while( ......... == 5) ?
Puisque la fonction fscanf renvoie le nombre d'éléments mis en correspondance et assignés.
5 - c'est le nombre de champs de ta structure - le champs que tu veux renseigner. -
Merci encore,je vais pouvoir continuer mon TD tranquilement en fait j'avais mis le paquet de fscanf en trop je ne vois pas pourquoi ils ne servent a rien...
Enfin tu ma débloqué , SUPER lol
Tchuss -
Désolé de déranger... j'ai un autre problème :-S
Enfait j'ai une liste de 16 véhicules ce qui est pas mal non?
Puis en fait lorsque j'exécute le programme bah il m'affiche bien jusque 15 voitures ( 0 a 15) mais quand je remonte tout en haut bah cela commence de la 4eme voiture qui est coupé( j'ai l'impression de remplir la mémoire de la boite d'exécution)
Désolé de vous embêter ^^ -
Rectification !!!!!!
J'ai trouvé juste apres avoir demandé ^^
J'ai augmenté ma mémoire tampon de la boite d'exécution a 300 (elle était a 80 lol)
MAis merci a ceux qui auront déja cherché hihihihi -
Re,
MAis merci a ceux qui auront déja cherché hihihihi
De rien ;-))
Justement j'étais en train de me demander ;-))