Recup de donnée dans un fichier en C

[Résolu/Fermé]
Signaler
-
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
-
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);
}

9 réponses

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 554
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++;
Ok merci j'essai sa et je tiens au courant ^^.
MErci beaucoup de m'avoir aidé
Messages postés
4
Date d'inscription
samedi 14 février 2009
Statut
Membre
Dernière intervention
14 février 2009

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
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 554
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

Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 554
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.
Messages postés
4
Date d'inscription
samedi 14 février 2009
Statut
Membre
Dernière intervention
14 février 2009

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
Messages postés
4
Date d'inscription
samedi 14 février 2009
Statut
Membre
Dernière intervention
14 février 2009

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 ^^
Messages postés
4
Date d'inscription
samedi 14 février 2009
Statut
Membre
Dernière intervention
14 février 2009

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
Messages postés
21331
Date d'inscription
jeudi 4 novembre 2004
Statut
Modérateur, Contributeur sécurité
Dernière intervention
30 octobre 2019
3 554
Re,

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