Les enregistrments et fichiers

Fermé
leilamoncif Messages postés 5 Date d'inscription samedi 31 janvier 2015 Statut Membre Dernière intervention 25 mai 2015 - Modifié par leilamoncif le 25/05/2015 à 15:02
pp25770 Messages postés 15 Date d'inscription samedi 8 septembre 2012 Statut Membre Dernière intervention 11 juin 2015 - 26 mai 2015 à 23:03
Bonjour,
je suis un peu débutante en programmation C,et j'ai encore des difficultés au niveau des enregistrements et fichiers.
en fait je veux réaliser" un programme en C qui remplit à partir du clavier une base de données composée de 20 livres,sauvgarde cette base dans un fichier BASE.txt,affiche sur l'écran un menu qui propose à l'utilisateur trois types de recherches dans cette base de données :une recherche selon le titre ou une recherche selon la date d'achat ou une rechaerche selon le prix et demande à l'utilisateur son désire pour effectuer la recherche demandée."
J'ai développé cinq fonctions (une fonction pour le remplissage ,une pour la sauvgarde et une fonction pour chaque type de recherche.
J'ai tout fait mais j'ai encore des erreurs :( ,j'attends votre aide et merçi d'avance :)
voila mon code:
<code c>
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define LMAX 20
typedef struct date{char jour [9];char mois[13];int annee;}D;
typedef struct livre {char auteur[10];
char titre[10];
float prix;
D dat;
}livres;
livres L[LMAX];
void sauvgarder(char *jour,char *mois,int annee,char *titre,char *auteur,float *prix)
{FILE *fichier;int j=0;
fprintf (fichier,"%s\n%s\n%d\n%s\n%s\%f",L[j].dat.jour,L[j].dat.mois,L[j].dat.annee,L[j].auteur,L[j].titre,L[j].prix);
}
void remplir(char *jour,char *mois,int annee,char *auteur,char *titre,float prix)
{int i;
for(i=0;i<LMAX;i++)
{
printf("\nentrer le jour de l'apparition du livre:");
scanf("%s\n",L[i].dat.jour);
printf("entrer le mois de l'apparition du livre:");
scanf("%s",L[i].dat.mois);
printf("enter l'annee de l'apparition du livre:");
scanf("%d",&L[i].dat.annee);
printf("enter l'auteur du livre:");
scanf("%s",L[i].auteur);
printf("entrer le titre du livre:");
scanf("%s",L[i].titre);
printf("entrer le prix du livre:");
scanf("%f",&L[i].prix);
sauvgarder(&L[i].dat.jour,&L[i].dat.mois,L[i].dat.annee,&L[i].auteur,&L[i].titre,L[i].prix);
}
}
int recherche_par_titre(char *tr)
{int rep=-1,i;
puts("donner le livre que vous voulez chercher par");
printf("titre:");gets(tr);
for(i=0;i<LMAX;i++)
{ if(strcmp(L[i].titre,tr)==0)
rep=i;
return (rep);
}
}
int recherche_par_dete_achat(char *jr,char*ms,int ann)
{int i,rep=-1;
puts("donner le livre que vous voulez chercher par");
printf("jour:");
gets(jr);
printf("mois:");
gets(ms);
printf("annee:");
scanf("%d",&ann);
for(i=0;i<LMAX;i++)
{if((strcmp(L[i].dat.jour,jr)==0)&&(strcmp(L[i].dat.mois,ms)==0)&&(L[i].dat.annee==ann))
rep=i;
return (rep);
}
}
int recherche_par_prix(float pr)
{int i,rep=-1;
puts("donner le livre que vous voulez chercher par");
printf("prix:");scanf("%f",&pr);
for(i=0;i<LMAX;i++)
{if(L[i].prix==pr)
rep=i;
return (rep);
}
}


void main()
{FILE *fich;char nomfichier[]="BASE.txt";int y;char *day;char *month;int year;char *title;float price;char *jj,*mm,*tt,*au;int aa;float px;int choix;
fich=fopen(nomfichier,"w");
if(!fich)
{
printf("impossible d'ouvrir le fichier :%s",nomfichier);
exit(-1);
}
remplir(&jj,&mm,aa,&tt,&au,px);
fclose (fich);
fich=fopen(nomfichier,"r");
while(!feof(fich))
{
fsacnf(fich,"%d",&choix);
printf("si vous voulez chercher par titre tapez 1");
printf("si vous voulez chercher par date d'achat tapez 2");
printf("si vous voulez chercher par prix tapez 3");
printf("si vous voulez quittez tapez 0");
switch (choix)
{
case 1:printf("%d",y=recherche_par_titre(&title));break;
case 2:printf("%d",y=recherche_par_dete_achat(&day,&month,year));break;
case 3:printf("%d",y=recherche_par_prix(price));break;
case 4:puts("au revoir");
default:puts("choix non autorise");exit (0);
}
}
fclose(fich);
getch();
}</code c>
A voir également:

1 réponse

pp25770 Messages postés 15 Date d'inscription samedi 8 septembre 2012 Statut Membre Dernière intervention 11 juin 2015 1
26 mai 2015 à 23:03
1 : le seul parametres de la fonction remplir doit être FILE *fichier qui sera fourni par le main remplir(fic);
2 : la fonction sauvegarde est inutile car il suffira de remplacer sauvgarder(...) par ton fprintf(fichier, "%s\n%s\n%d\n%s\n%s%f", ...)
3 : remplace fsacnf(fich,"%d",&choix); par scanf("%d",&choix);
4 : tes fonctions de recherche ne devraient pas avoir de paramètre car ils devraient se trouver dans les fonctions. Toutefois, tu peux remplacer
char *title par char title[20]
char *day char day[20]
char *month par char month[20]
Déclarer un pointeur est seulement une boite à adresse et non un contenant. Comme tu veux les utiliser dans tes fonctions, il faut une place. Erreur classique.
5 : enlever le caractere & des fonctions de recherche
6 : enlever le antislashN dans la la fonction remplir(), scanf("%s",L[i].dat.jour);
7 dans les f() de recherche lorsque la condition est vraie, utilise des accolades pour le if pour y ajouter l'instruction break; car quel que soit la condition, l'instruction return rep; sera également exécutée.
int rech...()
{
int i, rep = -1;
...
for()
{
if (vrai)
{
rep = i;
break;
}
}
return rep;
}
8: dans main(), remplace while(!feof(fich)) par while(1)
car tes recherches ne se font que dans la mémoire du tableau et donc la ré-ouverture de ton fichier est inutile.
9 : deplacer scanf("%d",&choix); après le menu.

Tout n'est pas corriger, car tu va être confrontée aux espaces pendant la lecture des chaines de caractères. scanf s'arrête dès qu'il voit un espace.
Ce qui donnerait :

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#define LMAX 20
typedef struct date
{
char jour [9];
char mois[13];
int annee;
}D;
typedef struct livre
{
char auteur[10];
char titre[10];
float prix;
D dat;
}livres;

livres L[LMAX];

void remplir(FILE *fichier)
{
int i;
for(i=0;i<LMAX;i++)
{
printf("\nentrer le jour de l'apparition du livre:");
scanf("%s",L[i].dat.jour);
printf("entrer le mois de l'apparition du livre:");
scanf("%s",L[i].dat.mois);
printf("entrer l'annee de l'apparition du livre:");
scanf("%d",&L[i].dat.annee);
printf("entrer l'auteur du livre:");
scanf("%s",L[i].auteur);
printf("entrer le titre du livre:");
scanf("%s",L[i].titre);
printf("entrer le prix du livre:");
scanf("%f",&L[i].prix);
fprintf(fichier, "%s\n%s\n%d\n%s\n%s\n%.2f\n",&L[i].dat.jour,&L[i].dat.mois,L[i].dat.annee,&L[i].auteur,&L[i].titre,L[i].prix);
}
}

int recherche_par_titre(char *tr)
{
int rep=-1,i;
puts("donner le livre que vous voulez chercher par");
printf("titre:");
scanf("%s",tr);
for(i=0;i<LMAX;i++)
{
if(strcmp(L[i].titre,tr)==0)
{
rep=i;
break;
}
}
return (rep);
}

int recherche_par_dete_achat(char *jr,char*ms,int ann)
{
int i,rep=-1;
puts("donner le livre que vous voulez chercher par");
printf("jour:");
gets(jr);
printf("mois:");
gets(ms);
printf("annee:");
scanf("%d",&ann);
for(i=0;i<LMAX;i++)
{
if((strcmp(L[i].dat.jour,jr)==0)&&(strcmp(L[i].dat.mois,ms)==0)&&(L[i].dat.annee==ann))
{
rep=i;
break;
}
}
return (rep);
}
int recherche_par_prix(float pr)
{
int i,rep=-1;
puts("donner le livre que vous voulez chercher par");
printf("prix:");scanf("%f",&pr);
for(i=0;i<LMAX;i++)
{
if(L[i].prix==pr)
{
rep=i;
break;
}
}
return (rep);
}


void main()
{
FILE *fich;
char nomfichier[]="BASE.txt";
int y;
char day[20];
char month[20];
int year;
char title[20];
float price;
char *jj,*mm,*tt,*au;
int aa;
float px;
int choix;

fich=fopen(nomfichier,"w");
if(!fich)
{
printf("impossible d'ouvrir le fichier :%s",nomfichier);
exit(-1);
}
remplir(fich);
fclose (fich);
while(1)
{
printf("si vous voulez chercher par titre tapez 1\n");
printf("si vous voulez chercher par date d'achat tapez 2\n");
printf("si vous voulez chercher par prix tapez 3\n");
printf("si vous voulez quittez tapez 0\n");
printf("votre choix :");
scanf("%d",&choix);
switch (choix)
{
case 1:printf("%d",y=recherche_par_titre(title));break;
case 2:printf("%d",y=recherche_par_dete_achat(day,month,year));break;
case 3:printf("%d",y=recherche_par_prix(price));break;
case 4:puts("au revoir");
default:puts("choix non autorise");exit (0);
}
}
getch();
}
0