Recup de donnée dans un fichier en C

Résolu/Fermé
Rudyskate - 14 févr. 2009 à 18:30
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 - 14 févr. 2009 à 21:36
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 :
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);
}
A voir également:

9 réponses

lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
14 févr. 2009 à 18:48
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 while
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++;
0
Ok merci j'essai sa et je tiens au courant ^^.
MErci beaucoup de m'avoir aidé
0
rudyskate Messages postés 4 Date d'inscription samedi 14 février 2009 Statut Membre Dernière intervention 14 février 2009
14 févr. 2009 à 20:18
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
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
14 févr. 2009 à 20:24
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 test
lami20j@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ésultat
lami20j@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

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
14 févr. 2009 à 20:27
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.
0
rudyskate Messages postés 4 Date d'inscription samedi 14 février 2009 Statut Membre Dernière intervention 14 février 2009
14 févr. 2009 à 20:35
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
0
rudyskate Messages postés 4 Date d'inscription samedi 14 février 2009 Statut Membre Dernière intervention 14 février 2009
14 févr. 2009 à 21:32
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 ^^
0
rudyskate Messages postés 4 Date d'inscription samedi 14 février 2009 Statut Membre Dernière intervention 14 février 2009
14 févr. 2009 à 21:34
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
0
lami20j Messages postés 21331 Date d'inscription jeudi 4 novembre 2004 Statut Modérateur, Contributeur sécurité Dernière intervention 30 octobre 2019 3 567
14 févr. 2009 à 21:36
Re,

MAis merci a ceux qui auront déja cherché hihihihi
De rien ;-))
Justement j'étais en train de me demander ;-))
0