Question sur les fichiers ^^
Forum Programmation : Question sur les fichiers ^^
TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique.
Pour obtenir de l'aide, inscrivez-vous gratuitement !
Bonjour à tous, voilà j'ai une petite question à vous poser sur les fichiers en effet je suis en train de faire un programme " de location vidéo " (projet ^^) et je voulais savoir quelquechose.
voici le code de deux fonctions :
void saisieDVD(FILM *f_dvd)
{
FILE *dvd; /* pointeur sur FILE */
char buffer[300];
/* Créer et remplir le fichier */
dvd = fopen("DVD.txt", "a+" ); /* lecture et écriture, positionnement en fin de fichier
si existant, création sinon).*/
if(!dvd)
{
printf("erreur d'ouverture du fichier" );
exit(-1);
}
else
{
printf("Entrez le numero du DVD : " );
gets(buffer);
strcpy(f_dvd->Numero_DVD,buffer);
fprintf(dvd, "%s,", f_dvd->Numero_DVD);
printf("Entrez le nom du DVD : " );
gets(buffer);
strcpy(f_dvd->Nom_DVD,buffer);
fprintf(dvd, "%s,", f_dvd->Nom_DVD);
printf("Entrez le Genre du DVD : " );
gets(buffer);
strcpy(f_dvd->Genre_DVD,buffer);
fprintf(dvd, "%s,", f_dvd->Genre_DVD);
printf("Entrer le Realisateur du film DVD : " );
gets(buffer);
strcpy(f_dvd->Realisateur_DVD,buffer);
fprintf(dvd, "%s,", f_dvd->Realisateur_DVD);
printf("Entrer la liste des acteur du film : " );
gets(buffer);
strcpy(f_dvd->Acteurs_DVD,buffer);
fprintf(dvd, "%s,", f_dvd->Acteurs_DVD);
printf("Entrer un resume du film : " );
gets(buffer);
strcpy(f_dvd->Resume_DVD,buffer);
fprintf(dvd, "%s\n", f_dvd->Resume_DVD);
}
fclose(dvd);
// return 0;
}
int ajoutDVD()
{
FILM DVD;
char rep;
do
{
saisieDVD(&DVD);
printf("autre ajout?o/n" );
scanf("%c",&rep);
}while((rep!='n')&&(rep!='N'));
return 0;
}
J'ai du utiliser des " fprintf " pour ecrire dans le fichier et tout est bien ecrit dans le fichier en question, mon problème intervient lorsque à la place de " fprintf ", j'utilise fwrite car quandj'ai utilisé fwrite en ouvrant le fichier je me suis retrouver avec des caractères très bizarre (찀쳌쳌穡e쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌穥a쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌獱d, quelque chose comme ca) ^^
donc j'aurais voulu savoir si je pouvais laisser en fprintf pour ecrire dans le fichier ou je devais utiliser fwrite ? ( et un fwrite qui ne ferais pas des carrées mais qui ecrirait normalement
)
Merci de votre aide ^^
Le fprintf convient parfaitement.
Pour le fwrite, as-tu bien donné la taille d'un bloc (sizeof (char) en fait = 1) et le nombre de blocs (strlen (tachaine) + 1 sans oublier le +1) ?
Merci CRicky de m'avoir répondu aussi vite
donc le pb vient donc de fwrite en utilisant fwrite mon code à donné ceci :
typedef struct{
char num[8]; // DVDXXXXX , VHSXXXXXX, CDSXXXXXX, LIVXXXXX
char titre[50];
char acteur[100];
char res[300];
char disp[2]; // un choix entre 0 et 99 produits du même types
}film;
void saisiefilm (film *f)
{
char buffer[100];
printf ("donner le num du film \n" );
fflush(stdout);
gets(buffer);
strcpy((f->num),buffer); // copie les données de buffer dans le champs num de f
fflush(stdin);
printf ("donner le titre du film \n" );
fflush(stdout);
gets(buffer);
strcpy((f->titre),buffer);
fflush(stdin);
printf ("donner des noms des acteurs \n" );
fflush(stdout);
gets(buffer);
strcpy((f->acteur),buffer);
fflush(stdin);
printf ("donner un bref sur le film \n" );
fflush(stdout);
gets(buffer);
strcpy((f->res),buffer);
fflush(stdin);
printf("donner le nombre de dvd disponible \n" );
fflush(stdout);
gets(buffer);
strcpy((f->disp),buffer);
fflush(stdin);
}
void ajoutDVD()
{
film flm;
char rep;
FILE *fp;
fp=fopen("DVD.txt","a+" );/*a+ (lecture et écriture, positionnement en fin de fichier si existant, création sinon).*/
if(!fp)
{
printf("erreur d'ouverture du fichier" );
exit(-1);
}
else
do
{
saisiefilm(&flm);
fwrite(&flm,sizeof(film),1,fp);
printf("autre ajout?o/n" );
scanf("%c",&rep);
}while (rep!='n');
fclose(fp);
}
et le pb dans le fichier txt ^^
penses tu que mon fwrite est faux ?
merci ^^
en fait ça copie la struture "film":
typedef struct{
char num[8]; // DVDXXXXX , VHSXXXXXX, CDSXXXXXX, LIVXXXXX
char titre[50];
char acteur[100];
char res[300];
char disp[2]; // un choix entre 0 et 99 produits du même types
}film;
sachant qu'un char [] n'est qu'un pointeur. Tu copies en fait:
- l'adresse mémoire où est stocké num
- l'adresse mémoire où est stocké titre
- l'adresse mémoire où est stocké acteur
- l'adresse mémoire où est stocké res
- l'adresse mémoire où est stocké disp
en fait tu ne copies aucun texte dans le fichier, juste les pointeur sur les textes. Les pointeur étant des adresses mémoire quand tu quitte le programme et que tu relances, ces adresses ne veulent plus rien dire.
Par exemple flm peut etre: 0x00FF0112, 0x00FF00F5, 0x00FF00A2, 0x00FF0001
et ce n'est qu'à l'adresse 0x00FF0112, qu'il y a les caractères.
Tu n'eregistre que les valeurs de ces pointeurs pas les caractères.
En fait tu dois faire un frwrite sur chaque ligne et donc remplacer
fwrite(&flm,sizeof(film),1,fp);
par:
fwrite(flm.num,sizeof(char),strlen (flm.num) + 1,fp);
fwrite(flm.titre,sizeof(char),strlen (flm.titre) + 1,fp);
fwrite(flm.acteur,sizeof(char),strlen (flm.acteur) + 1,fp);
fwrite(flm.res,sizeof(char),strlen (flm.res) + 1,fp);
fwrite(flm.disp,sizeof(char),strlen (flm.disp) + 1,fp);
effectivement je viens de comprendre que là on recopiait l'adresse de flm merci infiniment par contre est ce que c'est normal que tout s'écrit à la suite? Je m'explique est il possible lors de l'ajout de deux film simultanément de reprensenter comme ceci dans lme fichier ?
Nom Titre Acteur Resumé Disponibilité / pour le film 1
ensuite ca saute une ligne et ca écrit en dessous
Nom Titre Acteur Resumé Disponibilité / pour le film 2
de tel maniere a avoir
Nom Titre Acteur Resumé Disponibilité / pour le film 1
Nom Titre Acteur Resumé Disponibilité / pour le film 2
?^^
sinon j'ai esseyé une fonction qui permettait d'afficher les données d'un film mais je ne sais pas pourquoi ca ne marche pas ^^
le cas 4 represente l'affichage d'un film DVD ^^
///////////////////////////////////
case 4: printf("entrer numero DVD : " );
fflush(stdout);
scanf("%s",&numdvd);
fflush(stdin);
afficheDVD(numdvd);
///////////////////////////////////
void afficheDVD(char numf[]) // numf = DVD001
{
film *dvd;
FILE *fp=fopen("DVD.txt","r" );
if(!fp)
{
printf("erreur d'ouverture du fichier" );
exit(1);
}
else
{ while (fread(&dvd,sizeof(film),1,fp)) // ouvrir le fichier DVD.txt et comparer numf avec les numéros dans le fichier
{ if(numf==dvd->num)
{
printf("%s",dvd->titre);
printf("%s",dvd->acteur);
printf("%s",dvd->res);
printf("%d",numf);
printf("%lf.0",dvd->disp);
}
else printf("\nDVD inconnue\n\n" );
}
}fclose(fp);
}
je pense que l'erreur vient peut être du fread et du fait que dvd soit un pointeur du type film mais je ne vois pas plus ( le programme fait planté ^^)
Je pensais utiliser la commande strcmp pour comparer ce que lutilisateur souhaite entrer comme dvd, pour que dans le fichier, on compare si la chaine est la meme que le champ " Num " puis si c'est la même, afficher les données du film sinon renvoyé " film inconnu "
merci encore ^^
Le retour à la ligne est le caractère '\n'. Il te suffit de l'ajouter dans la chaine ou de refaire un fwrite avec "\n" de taille 1.
Pour le fread, c'est comme le fwrite, il va essayer de lire une structure film qui n'est qu'une liste de pointeur.
Donc il te faut allouer ton pointeur DVD (ou ne pas utiliser de pointeur car il faut penser à relacher la mémoire)
et faire des fread sur chaque chaine de caractères comme avec le fwrite.
Bonsoir !
Merci de m'avoir répondu aussi vite ^^
Je ne sais pas pourquoi mais je n'arrive tjrs pas à afficher les films qui sont à l'interieur du fichier, je réussi à afficher des trucs mais ca me mets tous pleins de caractères farfelus.
Si vous pouviez m'aider ca serait cool ^^
Je mets le code entier du programme.
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct{
char Numero_DVD[6+1];
char Nom_DVD[50];
char Genre_DVD[30];
char Realisateur_DVD[50];
char Acteurs_DVD[200];
char Resume_DVD[500];
}FILM;
void saisieDVD(FILM *f_dvd)
{
FILE *dvd; /* pointeur sur FILE */
char buffer[300];
/* Créer et remplir le fichier */
dvd = fopen("DVD.txt", "a+" ); /* lecture et écriture, positionnement en fin de fichier
si existant, création sinon).*/
if(!dvd)
{
printf("erreur d'ouverture du fichier" );
exit(-1);
}
else
{
printf("Entrez le numero du DVD : " );
gets(buffer);
strcpy(f_dvd->Numero_DVD,buffer);
fprintf(dvd, "Numero DVD : %s\n", f_dvd->Numero_DVD);
printf("Entrez le nom du DVD : " );
gets(buffer);
strcpy(f_dvd->Nom_DVD,buffer);
fprintf(dvd, "Nom DVD : %s\n", f_dvd->Nom_DVD);
printf("Entrez le Genre du DVD : " );
gets(buffer);
strcpy(f_dvd->Genre_DVD,buffer);
fprintf(dvd, "Genre DVD %s\n", f_dvd->Genre_DVD);
printf("Entrer le Realisateur du film DVD : " );
gets(buffer);
strcpy(f_dvd->Realisateur_DVD,buffer);
fprintf(dvd, "Realisateur : %s\n", f_dvd->Realisateur_DVD);
printf("Entrer la liste des acteur du film : " );
gets(buffer);
strcpy(f_dvd->Acteurs_DVD,buffer);
fprintf(dvd, "Acteurs : %s \n", f_dvd->Acteurs_DVD);
printf("Entrer un resume du film : " );
gets(buffer);
strcpy(f_dvd->Resume_DVD,buffer);
fprintf(dvd, "Resume du film : %s\n\n", f_dvd->Resume_DVD);
}
fclose(dvd);
}
void ajoutDVD()
{
FILM flm;
FILE *fp;
fp=fopen("DVD.txt","a+" );/*a+ (lecture et écriture, positionnement en fin de fichier si existant, création sinon).*/
if(!fp)
{
printf("erreur d'ouverture du fichier" );
exit(-1);
}
else saisieDVD(&flm);
fclose(fp);
}
void affiche_dvd (FILM f_dvd)
{
printf("%s",f_dvd.Numero_DVD);
fflush(stdout);
printf("%s",f_dvd.Nom_DVD);
fflush(stdout);
printf("%s",f_dvd.Genre_DVD);
fflush(stdout);
printf("%s",f_dvd.Realisateur_DVD);
fflush(stdout);
printf("%s",f_dvd.Acteurs_DVD);
fflush(stdout);
printf("%s",f_dvd.Resume_DVD);
fflush(stdout);
}
void liste_dvd(char *dvd)
{
FILE *fp;
FILM f_dvd; // film dvd de type FILM
fp=fopen("DVD.txt","r" );
while(!feof(fp)) // tant qu'on est pas a la fin du fichier
{
fread(f_dvd.Numero_DVD,sizeof(char),strlen(f_dvd.Numero_DVD)+1,fp);
fread(f_dvd.Nom_DVD,sizeof(char),strlen(f_dvd.Nom_DVD)+1,fp);
fread(f_dvd.Genre_DVD,sizeof(char),strlen(f_dvd.Genre_DVD)+1,fp);
fread(f_dvd.Realisateur_DVD,sizeof(char),strlen(f_dvd.Realisateur_DVD)+1,fp);
fread(f_dvd.Acteurs_DVD,sizeof(char),strlen(f_dvd.Acteurs_DVD)+1,fp);
fread(f_dvd.Resume_DVD,sizeof(char),strlen(f_dvd.Resume_DVD)+1,fp);
affiche_dvd(f_dvd);
}
fclose(fp);
}
int ParametreDVD(){
int choix;
char dvd[20]; // pour la fonction liste client
do{
printf("\nQue voulez vous faire \n\n" );
fflush(stdout);
printf("1:Ajouter fiche DVD\n" );
fflush(stdout);
printf("2:Supprimer fiche DVD\n" );
fflush(stdout);
printf("3:Modifier fiche DVD\n" );
fflush(stdout);
printf("4:Afficher fiche DVD\n" );
fflush(stdout);
printf("0:Retour Menu Principal\n" );
fflush(stdout);
printf("\nVotre choix : " );
scanf("%d",&choix);
fflush(stdin);
switch(choix)
{
case 1: ajoutDVD();
break;
/* case 2: suppclt();
break;
case 3: modifierclt();
break;*/
case 4: liste_dvd(dvd);
break;
break;
case 0: return(1);
default
rintf("\nMauvais choix\n" );
}
}while(choix!=0);
return(0);
}
int main(){
int choix;
do{
printf("\nBienvenue Dans le programme de Location video LOCATEK\n\n" );
fflush(stdout);
printf("Tapez:\n\n" );
fflush(stdout);
printf("1
our client\n" );
fflush(stdout);
printf("2
our dvd\n" );
fflush(stdout);
printf("3
our CD_audio\n" );
fflush(stdout);
printf("4
our livre\n" );
fflush(stdout);
printf("0:Quittez le programme\n" );
fflush(stdout);
printf("\nVotre choix : " );
fflush(stdout);
scanf("%d",&choix);
fflush(stdin);
switch(choix)
{
/* case 1: ParametreClient();
break;*/
case 2: ParametreDVD();
break;
/* case 3: ParametreCD();
break;
case 4: ParametreLivre();
break;*/
case 0: printf("\n******Fin programme********\n\n" );
exit(0);
default
rintf("\nMauvais choix, recommencer\n" );
}
}while(choix!=0);
return(1);
}
Merci d'avance!
C'est ça qui ne va pas:
fread(f_dvd.Numero_DVD,sizeof(char),strlen(f_dvd.Numero_DVD)+1,fp);
avant le fread, la chaine f_dvd.Numero_DVD est vide donc sa taille est de 0, ou pire la chaine n'est même pas initialisée, et donc la taille est aléatoire.
Tu as les possibilités suivantes:
- soit tu enregistres la longueur de la chaine juste avant la chaine pour savoir combien de caractères tu dois prendre
- soit tu récupères 7 caractères (la taille maximale de la chaine), en forçant l'ajout d'un '\0' au dernier caractère. L'incovénient est que tu dois remettre le curseur dans le fichier au bon endroit: il est positionné probablement trop loin (si la chaine ne fait que 3 caractères) et donc il faut repositionner le curseur avec fseek () sur le bon caractère
- soit tu récupères 7 caractères, mais tu enregistre également toujours 7 caractère lors du fwrite () au lieu d'utiliser strlen (). ça tévite de repositionner les curseur dans le fichier. Par contre à l'écriture, les caractères bizarre en dehors de la chaine seront écrit dans le fichier, mais tu peux remplacer tous ces caractères (de strlen (f_dvd.Numero_DVD) + 1 à 7) par des espaces (' ')
void liste_dvd(char *dvd)
{
FILE *fp;
FILM f_dvd; // film dvd de type FILM
fp=fopen("DVD.txt","r" );
while(!feof(fp)) // tant qu'on est pas a la fin du fichier
{
fread(f_dvd.Numero_DVD,sizeof(char),strlen(f_dvd.Numero_DVD)+1,fp);
fread(f_dvd.Nom_DVD,sizeof(char),strlen(f_dvd.Nom_DVD)+1,fp);
fread(f_dvd.Genre_DVD,sizeof(char),strlen(f_dvd.Genre_DVD)+1,fp);
fread(f_dvd.Realisateur_DVD,sizeof(char),strlen(f_dvd.Realisateur_DVD)+1,fp);
fread(f_dvd.Acteurs_DVD,sizeof(char),strlen(f_dvd.Acteurs_DVD)+1,fp);
fread(f_dvd.Resume_DVD,sizeof(char),strlen(f_dvd.Resume_DVD)+1,fp);
affiche_dvd(f_dvd);
}
fclose(fp);
}
merci CRicky donc si je comprends bien, il faut initialisé les champs f_dvd.Numero_DVD etc... ( je pensais qu'en faisant FILM f_dvd que ça allait directement allouée l'espace nécessaire pour la structure ^^), cependant avec les indications que vous m'aviez donner je n'arrive toujours pas à corriger mon problème, en fait je ne sais pas comment m'y prendre ^^ j'ai esseyé d'initialiser avant la boucler while les différents champs avec un malloc cela n'a rien donnée.
si vous pouviez m'aider ^^
Ce n'est pas un problème d'allocation mémoire, puisque effectivement film DVD alloue la mémoire de Numero_DVD par exemple.
Le problème est que strlen (f_dvd.Numero_DVD) lui vaut 0 car la chaine est alloué mais vide :-)
voici une des solutions que j'ai proposé (la 3eme je crois):
/* Lecture de 7 caractères */
fread(f_dvd.Numero_DVD,sizeof(char),sizeof(f_dvd.Numero_DVD),fp);
/* on replace le curseur là où il était avant le fread */
fseek(fp, -sizeof(f_dvd.Numero_DVD), SEEK_CUR)
/* on place le curseur après le numéro en tenant compte de la taille réelle de la chaine */
fseek( fp, strlen(f_dvd.Numero_DVD) + 1, SEEK_CUR) )
Les 2 derniers fseek peuvent etre remplacés par:
fseek( fp, strlen(f_dvd.Numero_DVD) - sizeof(f_dvd.Numero_DVD) + 1, SEEK_CUR) )
qui redéplace le curseur en arrière du nombre de caractères que l'on a trop lu.
EDIT: Le problème réside du fait que l'on ne connait pas la taille réelle de la chaine avoir de l'avoir lu: on sait juste que c'est infénieur à la taille maximale.
Donc je me suis ramener à l'étude unique du numero de DVD
void liste_dvd(char *dvd)
{
FILE *fp;
FILM f_dvd; // film dvd de type FILM
fp=fopen("DVD.txt","r" );
while(!feof(fp))
fread(f_dvd.Numero_DVD,sizeof(char),sizeof(f_dvd.Numero_DVD),fp);
fseek( fp, strlen(f_dvd.Numero_DVD) +1,SEEK_CUR) );
affiche_dvd(f_dvd);
}
fclose(fp);
Mais ceci m'amène à une boucle infini... je désespère t_t.
Le fread fait avancer le curseur trop loin, et tu l'envoies encore plus loin avec le fseek. Il faut mettre une valeur négative pour le faire revenir en arrière.
void liste_dvd(char *dvd)
{
FILE *fp;
FILM f_dvd; // film dvd de type FILM
fp=fopen("DVD.txt","r" );
while(!feof(fp))
{
fread(f_dvd.Numero_DVD,sizeof(char),sizeof(f_dvd.Numero_DVD),fp);
fseek( fp, sizeof(f_dvd.Numero_DVD) - strlen(f_dvd.Numero_DVD) - 1,SEEK_CUR) );
fread(f_dvd.Nom_DVD,sizeof(char),sizeof(f_dvd.Nom_DVD),fp);
fseek( fp, sizeof(f_dvd.Nom_DVD) - strlen(f_dvd.Nom_DVD) - 1,SEEK_CUR) );
fread(f_dvd.Genre_DVD,sizeof(char),sizeof(f_dvd.Genre_DVD),fp);
fseek( fp, sizeof(f_dvd.Genre_DVD) - strlen(f_dvd.Genre_DVD) - 1,SEEK_CUR) );
fread(f_dvd.Realisateur_DVD,sizeof(char),sizeof(f_dvd.Realisateur_DVD),fp);
fseek( fp, sizeof(f_dvd.Realisateur_DVD) - strlen(f_dvd.Realisateur_DVD) - 1,SEEK_CUR) );
fread(f_dvd.Acteurs_DVD,sizeof(char),sizeof(f_dvd.Acteurs_DVD),fp);
fseek( fp, sizeof(f_dvd.Acteurs_DVD) - strlen(f_dvd.Acteurs_DVD) - 1,SEEK_CUR) );
fread(f_dvd.Resume_DVD,sizeof(char),sizeof(f_dvd.Resume_DVD),fp);
fseek( fp, sizeof(f_dvd.Resume_DVD) - strlen(f_dvd.Resume_DVD) - 1,SEEK_CUR) );
affiche_dvd(f_dvd);
}
}
EDIT: j'ai pas testé donc je ne sais pas si ça marche. Si ça ne marche pas, indique ce que ça affiche ;-)
hmm même avec le " -1 " ca fai une boucle infini..
lorsque je rentre des données ( exemple 2 films ) bah ces 2 films s'affichent en continue de maniere infinie.
Je mets le code tout le code portant sur la saisie et l'affichage.Peut etre que l'erreur se trouve avant ..
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct{
char Numero_DVD[6+1];
char Nom_DVD[50];
char Genre_DVD[30];
char Realisateur_DVD[50];
char Acteurs_DVD[200];
char Resume_DVD[500];
}FILM;
void saisieDVD(FILM *f_dvd)
{
FILE *dvd; /* pointeur sur FILE */
char buffer[300];
/* Créer et remplir le fichier */
dvd = fopen("DVD.txt", "a+" ); /* lecture et écriture, positionnement en fin de fichier
si existant, création sinon).*/
if(!dvd)
{
printf("erreur d'ouverture du fichier" );
exit(-1);
}
else
{
printf("Entrez le numero du DVD : " );
gets(buffer);
strcpy(f_dvd->Numero_DVD,buffer);
fprintf(dvd, "%s\n", f_dvd->Numero_DVD);
printf("Entrez le nom du DVD : " );
gets(buffer);
strcpy(f_dvd->Nom_DVD,buffer);
fprintf(dvd, "%s\n", f_dvd->Nom_DVD);
/*printf("Entrez le Genre du DVD : " );
gets(buffer);
strcpy(f_dvd->Genre_DVD,buffer);
fprintf(dvd, "%s\n", f_dvd->Genre_DVD);
printf("Entrer le Realisateur du film DVD : " );
gets(buffer);
strcpy(f_dvd->Realisateur_DVD,buffer);
fprintf(dvd, "%s\n", f_dvd->Realisateur_DVD);
printf("Entrer la liste des acteur du film : " );
gets(buffer);
strcpy(f_dvd->Acteurs_DVD,buffer);
fprintf(dvd, "%s\n", f_dvd->Acteurs_DVD);
printf("Entrer un resume du film : " );
gets(buffer);
strcpy(f_dvd->Resume_DVD,buffer);
fprintf(dvd, "%s\n\n", f_dvd->Resume_DVD); */
}
fclose(dvd);
}
void ajoutDVD()
{
FILM flm;
FILE *fp;
fp=fopen("DVD.txt","a+" );/*a+ (lecture et écriture, positionnement en fin de fichier si existant, création sinon).*/
if(!fp)
{
printf("erreur d'ouverture du fichier" );
exit(-1);
}
else saisieDVD(&flm);
fclose(fp);
}
void affiche_DVD (FILM f_dvd)
{
printf("%s",f_dvd.Numero_DVD);
fflush(stdout);
printf("%s",f_dvd.Nom_DVD);
fflush(stdout);
/*printf("%s",f_dvd.Genre_DVD);
fflush(stdout);
printf("%s",f_dvd.Realisateur_DVD);
fflush(stdout);
printf("%s",f_dvd.Acteurs_DVD);
fflush(stdout);
printf("%s\n",f_dvd.Resume_DVD);
fflush(stdout); */
}
void liste_DVD()
{
FILE *fp;
FILM f_dvd; // film dvd de type FILM
fp=fopen("DVD.txt","r" );
while(!feof(fp)){ // tant qu'on est pas a la fin du fichier
fread(f_dvd.Numero_DVD,sizeof(char),sizeof(f_dvd.Numero_DVD),fp);
fseek( fp, sizeof(f_dvd.Numero_DVD) - strlen(f_dvd.Numero_DVD)-1,SEEK_CUR) ;
fread(f_dvd.Nom_DVD,sizeof(char),sizeof(f_dvd.Nom_DVD),fp);
fseek( fp, sizeof(f_dvd.Nom_DVD) - strlen(f_dvd.Nom_DVD) - 1,SEEK_CUR) ;
/* fread(f_dvd.Genre_DVD,sizeof(char),strlen(f_dvd.Genre_DVD)+1,fp);
fread(f_dvd.Realisateur_DVD,sizeof(char),strlen(f_dvd.Realisateur_DVD)+1,fp);
fread(f_dvd.Acteurs_DVD,sizeof(char),strlen(f_dvd.Acteurs_DVD)+1,fp);
fread(f_dvd.Resume_DVD,sizeof(char),strlen(f_dvd.Resume_DVD)+1,fp); */
affiche_DVD(f_dvd);
}
fclose(fp);
}
int ParametreDVD()
{
int choix;
FILM fdvd;
char dvd[20]; // pour la fonction liste client
do{
printf("\nQue voulez vous faire \n\n" );
fflush(stdout);
printf("1:Ajouter fiche DVD\n" );
fflush(stdout);
printf("2:Supprimer fiche DVD\n" );
fflush(stdout);
printf("3:Modifier fiche DVD\n" );
fflush(stdout);
printf("4:Afficher fiche DVD\n" );
fflush(stdout);
printf("0:Retour Menu Principal\n" );
fflush(stdout);
printf("\nVotre choix : " );
scanf("%d",&choix);
fflush(stdin);
switch(choix)
{
case 1: ajoutDVD();
break;
/* case 2: supp_DVD();
break;*/
/*case 3: {
saisieDVD(&fdvd);
modifier_DVD(fdvd);
}
break;*/
case 4: liste_DVD();
break;
break;
case 0: return(1);
default
rintf("\nMauvais choix\n" );
}
}while(choix!=0);
return(0);
}
int main()
{
int choix;
do{
printf("\nBienvenue Dans le programme de Location video LOCATEK\n\n" );
fflush(stdout);
printf("Tapez:\n\n" );
fflush(stdout);
printf("1
our client\n" );
fflush(stdout);
printf("2
our dvd\n" );
fflush(stdout);
printf("3
our CD_audio\n" );
fflush(stdout);
printf("4
our livre\n" );
fflush(stdout);
printf("0:Quittez le programme\n" );
fflush(stdout);
printf("\nVotre choix : " );
fflush(stdout);
scanf("%d",&choix);
fflush(stdin);
switch(choix)
{
/* case 1: ParametreClient();
break;*/
case 2: ParametreDVD();
break;
/* case 3: ParametreCD();
break;
case 4: ParametreLivre();
break;*/
case 0: printf("\n******Fin programme********\n\n" );
exit(0);
default
rintf("\nMauvais choix, recommencer\n" );
}
}while(choix!=0);
return(1);
}
Merci d'avance.
Bon j'ai finalement testé ton programme.
Et ton problème viens du fait que tu enregistres avec fprintf qui n'eregistre pas le '\0', donc en fait tout le fichier est mis dans Numero_DVD (le retour à la ligne '\n' n'est pas un séparateur de chaine).
Donc je te suggère de remplacer les fread par:
fscanf( fp, "%s\n", f_dvd.Numero_DVD );
fscanf( fp, "%s\n", f_dvd.Nom_DVD );
Et là ça marchera (j'ai testé ;-) ).
Sinon dans ta fonction affiche_DVD, tu mets:
printf ("%s", f_dvd.Numero_DVD);
tu n'affiche pas de retour à la ligne donc tout s'affiche à la suite, donc pense à mettre:
printf ("%s\n", f_dvd.Numero_DVD);
Voilà, bonne continuation ;-)
J'ai quelques problèmes que je n'arrive toujours pas à résoudre
C'est pour une modification de la base de données ( le .txt).
Je n'arrive pas à modifier un film ou à en supprimer un.
void modifier_DVD(FILM dvd)
{
FILE *fp;
FILM tmp;
if(fp=fopen("DVD.txt","r+b" ))
{
fseek(fp,0,0);
while(!feof(fp))/*retourne 0 et on sort de la boucle si c'est la fin du fichier */
{
fread (&tmp,sizeof(FILM),1,fp);/*lit des objets de taille FILM stockés dans le fichier*/
if(!feof(fp))
{
if(tmp.Numero_DVD==dvd.Numero_DVD)
{
fseek(fp,-sizeof(FILM),SEEK_CUR);/*on est a la position courante dans le fichier*/
fwrite(&dvd,sizeof(FILM),1,fp);
break;
}
}
else
printf("\nEnregistrement non trouvé\n" );
}
}
else
printf("erreur" );
fclose(fp);
}
par contre il met " enregistrement non trouvé " tout le temps donc je suppose qu'il y a encore un problème avec fseek.
Pouvez vous m'aider s'il vous plait?
Merci d'avance.
Je répète: utilise fprintf et fscanf partout.
Et tu refais la même erreur: FILM ne contient que des pointeurs.
Par contre, je ne vois pas de fonctions permettant de supprimer ou remplacer un bout de fichier: je pense que tu dois réécrire tout le fichier à chaque modification/suppression.
Il y a 2434 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.
