Tom's Guide > Forum > Programmation > Question sur les fichiers ^^
Mot :    Pseudo :           
 

Bonjourà tous voilà en fait j'ai un pb au niveau de l'utilisation de remove et rename je ne comprend pas pourquoi ca ne veut pas marcher, pouvez vous m'aider à y voir plus clair.

Merci!

Je fais une fonction pour supprimer dans un fichier un client.

void supprimer_client(double id)
{
/* ce qu'il faut faire :

- créer un 2eme fichier temporaire
- lire le 1er enregistrement de client
- regarder si le num_client de cet enregistrement == id
- si non copier cet enregistrement dans le fichier temporaire
- si oui ne pas copier cet enregistrement
- arrivé a la fin du fichier client : effacer le fichier client ,
renommer le fichier temporaire avec le nom "client"

*/

int test;

FILE *fp;
FILE *tmp_file;

client tmp_clt;

fp=fopen("c:\\client","rb" );
tmp_file=fopen("c:\\temp","a+b" );

while(!feof(fp))
{
fread(&tmp_clt,sizeof(client),1,fp);
if(id!=tmp_clt.numclt)
{
fwrite(&tmp_clt,sizeof(client),1,tmp_file);

}
}
fclose(tmp_file);
fclose(fp);
test=remove("c:\\client" );
if(test!=0)
printf("erreur" );

rename("c:\\temp","c:\\client" );
printf("Client efface\n\n" );
}

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

bien pour être franc, je vois pas ou c'est faux...
Tu as quoi comme erreur au fait? parce que comme cela je vois vraiment pas...
Je doit bien t'avouer que j'ai jamais utiliser le fread pour lire toute une structure (j'utilise beaucoup plus les fprintf, fscanf, fgets) et je sais pas trop si ca marche... sinon la seul remarque un petit peu constructive que je peux faire c'est que je vois pas pourquoi tu ouvres pas tes fichiers en "r" et "w", il me semble que le "b" pour bytes ne sert plus a rien sur les dernières versions des compilo...
Sinon tu as essayé de voir si les fichiers avait bien été ouvert (en testant si le FILE * est pas NULL) et si ton fread renvoyait bien une valeur positif (qui correspondrait au nombre de caractères lu)...

Répondre à tiopai

le fichier "c:\client" existe bien ?
N'oublie pas de mettre l'extension s'il y en a une.

Répondre à CRicky

Effectivement je ne vois pas non plus mon erreur, en fait dans mon programme je décide par exemple d'ajouter 2 clients différents ( N° client 1 et 2) ensuite j'utilise la fonction supprmier pour par exemple supprimer le client n° 1 et là où est le problème c'est qu'il me mets erreur ( test de la condition d'effacement) quand je veux effacer le fichier. En gros la fonction à bien crée un fichier temporaire "temp" et y a mis les données du fichier client SAUF les données du client n°1 mais la fonction n'arrive pas à effacer le fichier "client" et à renomer le fichier "temp" en "client" . voilà ^^

je mets le code afin d'y voir plus claire merci pour vos reponses ^^


#include<stdio.h>
#include<stdlib.h>

typedef struct{
double numclt;
char nom[20];
char prenom [20];
char adr[50];
double tel;
}client;




typedef struct{
unsigned num;
char titre[30];
char acteur[50];
char res[300];
int disp;
}film;


void saisieclient (client *clt)
{ char *ch,*buffer;FILE *fp;fp=fopen("c:\\client","a+b" );
printf ("donner le num du client \n" );
fflush(stdout);
scanf("%lf",&(clt->numclt));
fflush(stdin);
printf ("donner le nom \n" );fflush(stdout);
scanf("%s",(clt->nom));
fflush(stdin);
printf ("donner le prenom \n" );fflush(stdout);
scanf("%s",(clt->prenom));
fflush(stdin);
printf ("donner l'adresse \n" );fflush(stdout);
gets(clt->adr);
//strcpy(clt->adr,buffer);
fprintf(fp, "%s ", clt->adr);
fflush(stdin);
printf ("donner le num de tel \n" );fflush(stdout);
scanf("%lf",&(clt->tel));
fflush(stdin);
//fclose(fp);
}


void afficherclient (client clt)
{

printf("%.0lf ",clt.numclt);
fflush(stdout);
printf("%s ",clt.nom);
fflush(stdout);
printf("%s ",clt.prenom);
fflush(stdout);
printf("%s ",clt.adr);
fflush(stdout);
printf("%.0lf\n",clt.tel);
fflush(stdout);
}





void ajouter_client(client clt,char *nomfichier)
{
FILE *fp;
client tmp;

if(fp=fopen(nomfichier,"a+b" ))
{
fseek(fp,0,0);
while(!feof(fp))
{
fread(&tmp,sizeof(client),1,fp);
if(tmp.numclt==0||feof(fp))
{
fseek(fp,-sizeof(client),1);
fwrite(&clt,sizeof(client),1,fp);
break;
}
}

}
else
printf("\nerreur !!" );
fclose(fp);
}

void liste_client(char *nomfichier)
{
FILE *fp;
client clt;
if (fp=fopen(nomfichier,"r+b" ))
{
fseek(fp,0,0);

while(!feof(fp))
{
fread(&clt,sizeof(client),1,fp);

if(!feof(fp)&&clt.numclt)
afficherclient(clt);

}
}
else("erreur\n" );
fclose(fp);

}

void modifier_client(client clt,char * nomfichier)
{
FILE *fp;
client tmp;
if(fp=fopen(nomfichier,"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(client),1,fp);/*lit des objets de taille client stockés dans le fichier*/
if(!feof(fp))
{
if(tmp.numclt==clt.numclt)
{
fseek(fp,-sizeof(client),SEEK_CUR);/*on est a la position courante dans le fichier*/
fwrite(&clt,sizeof(client),1,fp);
break;
}

}

else


printf("\nEnregistrement non trouvée" );
}
}
else
printf("erreur" );

fclose(fp);
}



void supprimer_client(double id)
{
/* ce qu'il faut faire :

- créer un 2eme fichier temporaire
- lire le 1er enregistrement de client
- regarder si le num_client de cet enregistrement == id
- si non copier cet enregistrement dans le fichier temporaire
- si oui ne pas copier cet enregistrement
- arrivé a la fin du fichier client : effacer le fichier client ,
renommer le fichier temporaire avec le nom "client"

*/

int test;

FILE *fp;
FILE *tmp_file;

client tmp_clt;

fp=fopen("c:\\client","rb" );
tmp_file=fopen("c:\\temp","a+b" );

while(!feof(fp))
{
fread(&tmp_clt,sizeof(client),1,fp);
if(id!=tmp_clt.numclt)
{
fwrite(&tmp_clt,sizeof(client),1,tmp_file);

}
}
fclose(tmp_file);
fclose(fp);
test=remove("c:\\client" );
if(test!=0)
printf("erreur" );

rename("c:\\temp","c:\\client" );
printf("Client efface\n\n" );
}

int ParametreClient(){
int choix,c;
client clt;
double id;
char fichierclt[]="c:\\client";
do{
printf("1:Ajouter fiche client\n" );
fflush(stdout);
printf("2:Supprimer fiche client\n" );
fflush(stdout);
printf("3:Modifier fiche client\n" );
fflush(stdout);
printf("4:Afficher fiche client\n" );
fflush(stdout);
printf("\n0:Quitter\n" );
fflush(stdout);
scanf("%d",&choix);
fflush(stdin);
switch(choix){

case 1 : saisieclient(&clt);
ajouter_client(clt,fichierclt);
break;

case 2: printf("\n donnez l'numéro de client a supprimer \n" );
fflush(stdout);
scanf("%lf",&id);
fflush(stdin);
supprimer_client(id);
break;


case 3:
saisieclient(&clt);
modifier_client(clt,fichierclt);
break;

case 4: liste_client(fichierclt);
break;
case 0: return(1);
default: printf("Mauvais choix\n" );
fflush(stdout);
}
}while(choix!=0);
return(0);
}


int main(){



int c;
do{
printf("bienvenue\n" );
fflush(stdout);
printf("Tapez:\n\n" );
fflush(stdout);
printf("1:Pour client\n" );
fflush(stdout);
printf("2:Pour dvd\n" );
fflush(stdout);
printf("3:Pour CD_audio\n" );
fflush(stdout);
printf("4:Pour livre\n" );
fflush(stdout);
printf("\n0:Quitter\n" );
fflush(stdout);
scanf("%d",&c);
fflush(stdin);
switch(c){
case 1:ParametreClient();
break;
/*case 2:ParametreDVD();
break;
case 3:ParametreCD();
break;
case 4:ParametreLivre();
break;*/
default :printf("Mauvais choix\n" );
}
}while(c!=0);
printf("******Fin programme********\n" );
return 1;
}

Répondre à nouss@IDN

tu as essayé de mettre fflush:

fflush(tmp_file);
fflush(fp);
fclose(tmp_file);
fclose(fp);
test=remove("c:\\client" );
if(test!=0)
printf("erreur" );

Enfin franchement ca devrait pas être cela l'erreur mais cela te coute rien d'essayer :p
Sinon il y a un autre moyen (que moi j'utilise :p) c'est de faire une commande system pour effacer et renommer le fichier: sous linux par exemple
system("mv temp client" );
Sous windows, tu fais plusieurs commandes avec "del" et "copy"

Je viens de lire a l'adresse http://dpobel.free.fr/man/html/aff [...] an/remove/
que l'on pouvait accèder au code d'erreur de la fonction remove... ca te permettrait de savoir pourquoi il veut pas l'effacer...

Répondre à tiopai

Bonjour, alors voilà j'ai testé avec des fflush malheuresement cela n'a rien donnée ceci dis j'ai remarquer que le remove et rename avait l'air de marcher lorsqu'on quittait le programme complemtent puis qu'on le relançait, le pb après intervient lorsque par ex jai deux client 1 et 2 et que je supprime le 1, ensuite je quitte le programme et le relance et quand je refais supprimer pour un client là il efface bien"client" et renome "temp" en client.

Je ne comprends plus ^^

Répondre à nouss@IDN

franchement utilise les commandes sytème. J'ai toujours fait cela (car je connaissait pas les fonctions remove et rename) et je n'ai jamais eu aucun problème de ce genre... en plus ca doit te couter trois lignes de code:
system("del client" );
system("copy temp client" );
system("del temp" );
faut inclure stdlib.h si ce n'est déja fait

Répondre à tiopai

tiopai ca marche !!!! :-) merci
le fichier "client" s'est bien effacé et le fichier "temp" a été renomé en "client", il y avait un pb sur le fait que le fichier était "client" était ouvert à cause de la fonction ParametreClient d'ou un conflit de processus lors de l'écriture sur le fichier. Par contre j'ai un autre pb sur la supression.

Je m'explique j'ajoute 3 clients dans le fichier, admettons :

client / nom / prenom / adresse / n° tel
1 Pouf pouf 20 rue Pouf 0123456
2 Pif pif 20 rue Pif 0654321
3 Paf paf 20 rue Paf 0456321

ensuite je fais Afficher les films j'obtiens bien

1 Pouf pouf 20 rue Pouf 0123456
2 Pif pif 20 rue Pif 0654321
3 Paf paf 20 rue Paf 0456321

maintenant je suprime par exemple le client 2
cela marche nickel et j'ai en prime le msg " 1 fichier copié"

mais le problème vient du fait que lors que j'affiche à nouveau la liste des clients j'ai

1 Pouf pouf 20 rue Pouf 0123456
3 Paf paf 20 rue Paf 0456321
3 Paf paf 20 rue Paf 0456321

deux fois le 3eme client donc je sais pas si c'est normal ^^ Encore merci !!! :)

Code :
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. typedef struct{
  4.     double numclt;
  5.     char nom[20];
  6.     char prenom [20];
  7.     char adr[50];
  8.     double tel;
  9. }client;
  10. typedef struct{
  11.     unsigned num;
  12.     char titre[30];
  13.     char acteur[50];
  14.     char res[300];
  15.     int disp;
  16. }film;
  17. void saisieclient (client *clt)
  18.     char *ch,*buffer;
  19.     FILE *fp;fp=fopen("c:\\client","a+b" );
  20.     printf ("donner le num  du client \n" );
  21.     fflush(stdout);
  22.     scanf("%lf",&(clt->numclt));
  23.     fflush(stdin);
  24.     printf ("donner le nom \n" );fflush(stdout);
  25.     scanf("%s",(clt->nom));
  26.     fflush(stdin);
  27.     printf ("donner le prenom \n" );fflush(stdout);
  28.     scanf("%s",(clt->prenom));
  29.     fflush(stdin);
  30.     printf ("donner l'adresse \n" );fflush(stdout);
  31.     gets(clt->adr);
  32.     //strcpy(clt->adr,buffer);
  33.     fprintf(fp, "%s ", clt->adr);
  34.     fflush(stdin);
  35.     printf ("donner le num de tel \n" );fflush(stdout);
  36.     scanf("%lf",&(clt->tel));
  37.     fflush(stdin);
  38.     //fclose(fp);
  39. }
  40. void afficherclient (client clt)
  41. {
  42.     printf("%.0lf  ",clt.numclt);
  43.     fflush(stdout);
  44.     printf("%s    ",clt.nom);
  45.     fflush(stdout);
  46.     printf("%s    ",clt.prenom);
  47.     fflush(stdout);
  48.     printf("%s    ",clt.adr);
  49.     fflush(stdout);
  50.     printf("%.0lf\n",clt.tel);
  51.     fflush(stdout);
  52. }
  53. void ajouter_client(client clt)
  54. {
  55.     FILE *fp;
  56.     client tmp;
  57.     if(fp=fopen("client","a+b" ))
  58.     {
  59.       fseek(fp,0,0);
  60.       while(!feof(fp))
  61.       {
  62.           fread(&tmp,sizeof(client),1,fp);
  63.           if(tmp.numclt==0||feof(fp))
  64.           {
  65.               fseek(fp,-sizeof(client),1);
  66.               fwrite(&clt,sizeof(client),1,fp);
  67.               break;
  68.           }
  69.       }
  70.     }
  71.     else
  72.     printf("\nerreur !!" );
  73.     fclose(fp);
  74. }
  75. void liste_client()
  76. {
  77. FILE *fp;
  78. client clt;
  79. if (fp=fopen("client","r+b" ))
  80. {
  81.   fseek(fp,0,0);
  82.   while(!feof(fp))
  83.   {
  84.      fread(&clt,sizeof(client),1,fp);
  85.      if(!feof(fp)&&clt.numclt)
  86.      afficherclient(clt);
  87.   }
  88. }
  89. else("erreur\n" );
  90. fclose(fp);
  91. }
  92. void modifier_client(client clt)
  93. {
  94. FILE *fp;
  95. client tmp;
  96.   if(fp=fopen("client","r+b" ))
  97.   {
  98.      fseek(fp,0,0);
  99.       while(!feof(fp))/*retourne 0 et on sort de la boucle si c'est la fin du fichier */
  100.       {
  101.          fread (&tmp,sizeof(client),1,fp);/*lit des objets de taille client stockés dans le fichier*/
  102.             if(!feof(fp))
  103.             {
  104.                  if(tmp.numclt==clt.numclt)
  105.                 { 
  106.                     fseek(fp,-sizeof(client),SEEK_CUR);/*on est a la position courante dans le fichier*/
  107.                     fwrite(&clt,sizeof(client),1,fp);
  108.                     break;
  109.                  }
  110.             }
  111.             else
  112.           printf("\nEnregistrement non trouvée" );
  113.       }
  114.      }
  115.       else
  116.       printf("erreur" );
  117.   fclose(fp);
  118. }
  119. void supprimer_client(double id)
  120. {
  121.     /* ce qu'il faut faire :
  122.      
  123.       - créer un 2eme fichier temporaire
  124.       - lire le 1er enregistrement de client
  125.       - regarder si le num_client de cet enregistrement == id
  126.       - si non copier cet enregistrement dans le fichier temporaire
  127.       - si oui ne pas copier cet enregistrement
  128.       - arrivé a la fin du fichier client : effacer le fichier client ,
  129.       renommer le fichier temporaire avec le nom "client"
  130.      
  131.       */
  132.     int test;
  133.              
  134.     FILE *fp;
  135.     FILE *tmp_file;
  136.     client tmp_clt;
  137.     fp=fopen("client","r+b" );
  138.     tmp_file=fopen("temp","a+b" );
  139.      
  140.     while(!feof(fp))
  141.     {
  142.           fread(&tmp_clt,sizeof(client),1,fp);
  143.           if(id!=tmp_clt.numclt)
  144.           {
  145.                 fwrite(&tmp_clt,sizeof(client),1,tmp_file);         
  146.           }         
  147.       }
  148.       fclose(tmp_file);
  149.       fflush(tmp_file);
  150.       fclose(fp);
  151.       fflush(fp);
  152.      
  153.       system("del client" );
  154.       system("copy temp client" );
  155.       system("del temp" );
  156.      
  157. }
  158.                      
  159. int ParametreClient(){
  160. int choix,c;
  161. client clt;
  162. double id;
  163.   do{
  164.     printf("1:Ajouter fiche client\n" );
  165.     fflush(stdout);
  166.     printf("2:Supprimer fiche client\n" );
  167.     fflush(stdout);
  168.     printf("3:Modifier fiche client\n" );
  169.     fflush(stdout);
  170.     printf("4:Afficher fiche client\n" );
  171.     fflush(stdout);
  172.     printf("\n0:Quitter\n" );
  173.     fflush(stdout);
  174.     scanf("%d",&choix);
  175.     fflush(stdin);
  176.     switch(choix){
  177.         case 1 :  saisieclient(&clt);
  178.                   ajouter_client(clt);
  179.                   break;
  180.         case 2:  printf("\n donnez l'numéro de client a supprimer \n" );
  181.                   fflush(stdout);
  182.                   scanf("%lf",&id);
  183.                   fflush(stdin);
  184.                   supprimer_client(id);
  185.                   break;
  186.         case 3:
  187.                   saisieclient(&clt);         
  188.                   modifier_client(clt);
  189.                   break;
  190.         case 4:  liste_client();
  191.                   break;
  192.         case 0: return(1);
  193.         default:  printf("Mauvais choix\n" );
  194.                   fflush(stdout);
  195.     }
  196.   }while(choix!=0);
  197.   return(0);
  198. int main(){
  199. int c;
  200.   do{
  201.     printf("bienvenue\n" );
  202.     fflush(stdout);
  203.     printf("Tapez:\n\n" );
  204.     fflush(stdout);
  205.     printf("1:Pour client\n" );
  206.     fflush(stdout);
  207.     printf("2:Pour dvd\n" );
  208.     fflush(stdout);
  209.     printf("3:Pour CD_audio\n" );
  210.     fflush(stdout);
  211.     printf("4:Pour livre\n" );
  212.     fflush(stdout);
  213.     printf("\n0:Quitter\n" );
  214.     fflush(stdout);
  215.     scanf("%d",&c);
  216.     fflush(stdin);
  217.           switch(c){
  218.               case 1:ParametreClient();
  219.                     break;
  220.               /*case 2:ParametreDVD();
  221.                     break;
  222.                case 3:ParametreCD();
  223.                     break;
  224.                case 4:ParametreLivre();
  225.                     break;*/
  226.               default :printf("Mauvais choix\n" );
  227.           }
  228.   }while(c!=0);
  229.   printf("******Fin programme********\n" );
  230.   return 1;
  231. }


Répondre à nouss@IDN

en fait j'ai pas tout compris...
c'est dans le même exécutable que tu effaces puis réaffiches la liste des clients ou alors tu arrête l'excution et tu en relances une ou tu affiches les clients...
A vue de nez j'aurais dit qu'il manque peut être un fclose mais ca a pas l'air d'être cela... sinon je comprends toujours pas tes ouvertures de fichier en r+b, a+b quand des r et w suffisent la plupart du temps
void liste_client()
{
FILE *fp;
client clt;
if (fp=fopen("client","r" ))
{
while(!feof(fp))
{
if(fread(&clt,sizeof(client),1,fp))
afficherclient(clt);

}
}
else("erreur\n" );
fclose(fp);

}

c'est dans cette fonction qu'il t'affiche toujours trois clients?? bien je l'ai modifié et j'aurais fait comme cela, il se peut qu'il lise deux fois la dernière ligne a ce moment la tu ajoutes un && feof(fp) dans le if mais bon onverra bien; bon il est tard et je suis un peu crevé la donc j'espère que jeraconte pas trop de conneries

Répondre à tiopai

Bonjour tiopai, bonne nouvelle grâce a tes indications j'ai rajouter !feof(fp) dans la fonction supprimer et la ca marche nickel ! je te remercie pour ton aide et je remercie aussi CRicky
Maintenant j vais mattaquer aux produits ( VHS, DVD, livre et CD) en m'appuyant sur les fonctions des clients.

Merci encore pour votre aide ! je vous tiens au courant !

Ps : c'est un projet que je dois faire dans mon école ^^

Répondre à nouss@IDN

Cool, en plus cela m'a évité de regarder ton code dans le détail :p
Content d'avoir pu servir a quelque chose ;)

Répondre à tiopai
Tom's Guide > Forum > Programmation > Question sur les fichiers ^^
Aller à :

Il y a 221 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens