Supprimer une ligne d'un fichier en C
Résolu
moi411
Messages postés
183
Statut
Membre
-
moi411 -
moi411 -
Salut tout le monde,
Mon problème est donc de supprimer un ligne dans un fichier. Le programme doit pouvoir gérer des comptes donc encoder, modifier, supprimer et afficher le différents comptes...
Je met tout le code mais je pense que mon problème n'est présent que dans ma fonction servant justement, à supprimer une ligne...
Le problème est que quand je demande à supprimer un compte,
l'ordinateur s'arrête. Je pense que le problème vient du "fseek".
Comme nous avons à peine commencé la gestion des fichiers, notre prof nous a dit que le plus simple, pour commencer, serait d'écraser la ligne à supprimer par la ligne qui suit... C'est donc ce que j'ai essayé de faire mais je n'y suis pas parvenu.
Si c'est important de le préciser je travail sous borland.
Si quelqu'un pouvait m'aider, ce serait gentil. A bientôt et merci d'avance.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define max 10
FILE*fichier;
typedef struct
{
char nom[30];
char prenom[30];
float monttant;
int occupe;
}tcompte;
//prototype de la fonction encode----------------------------------
int encode(tcompte *c, char *tab1, char *tab2, float valeur);
//---------------------------------------------------------------------
//prototype de la fonction eff------------------------------
int eff(tcompte *c, char *tab1, char *tab2);
//------------------------------------------------------------------------------
//prototype de la fonction modifier------------------------
int mod(tcompte *c, char *tab1, char *tab2, float valeur);
//------------------------------------------------------------------------------
//prototype de la fonction afficher-------------------------
int aff(tcompte *c);
//------------------------------------------------------------------------------
void main()
{
clrscr();
tcompte c;
float m; /*monttant*/
char choix; /*différentes options*/
char n[30]; /*nom*/
char p[30]; /*prénom*/
// char pass[10]; /*mot de passe à trouver0*/
// char code[]={"shrek"};
printf("\n\t\tMENU\n\n");
printf("\te.Encoder un compte\n");
printf("\ts.Supprimer un compte\n");
printf("\tm.Modifier un compte\n");
printf("\ta.Afficher les comptes\n");
printf("\tq.Quitter le programme\n");
do
{
printf("\n\n\nFaites votre choix: ");
choix=getch();
printf("%c",choix);
switch (choix)
{
//ajouter un compte
case 'e': printf("\n\n\n\tEntrez le nom du client: ");
flushall();
scanf("%s",&n);
printf("\tEntrez le prenom du client: ");
flushall();
scanf("%s",&p);
printf("\tEntrez le montant restant a payer: ");
flushall();
scanf("%f",&m);
if(encode(&c,n,p,m)==0)
{
printf("\n\n\tOn ne peut plus encoder!!!\n\n\n");
}
else
{
printf("\n\n\tLe compte est bien encode\n\n\n");
}
break;
//effacer un compte
case 's': printf("\n\n\n\tEntrez le nom du client a effacer: ");
flushall();
scanf("%s",&n);
printf("\tEntrez le prenom du client a effacer: ");
flushall();
scanf("%s",&p);
if(eff(&c,n,p)==0)
{
printf("\n\n\tLe fichier n'exiqte pas!!!\n\n",p,n);
}
else
{
printf("\n\n\tLe compte de %s %s est bien efface.\n\n",p,n);
}
break;
//modifier un compte
case 'm': printf("\n\n\tEntrez le nom du client a modifier: ");
flushall();
scanf("%s",&n);
printf("\tEntrez le prenom du client a modifier: ");
flushall();
scanf("%s",&p);
printf("\n\nEntrez la somme paye: ");
flushall();
scanf("%f",&m);
switch(mod(&c,n,p,m))
{
case 0: printf("\n\n\tLe fichier n'a pu etre ouvert!!!\n\n");
break;
case 1: printf("\n\n\tLa somme a payer est trop grande\n\n");
break;
case 2: printf("\n\n\tLe compte est modifie\n");
break;
case 3: printf("\n\n\tIl n'y a pas de compte a ce nom!!!\n\n");
}
break;
//afficher les comptes
case 'a':
if(aff(&c)==0)
{
printf("\n\n\tIl n'y a aucun compte!!!\n\n");
}
else
{
printf("\tVoici le(s) compte(s)\n\n");
}
break;
case 'q':
break;
}
}
while(choix!='q');
}
//fonction encode--------------------------
int encode(tcompte *c, char *tab1, char *tab2, float valeur)
{
fichier=fopen("C:\\fichier.txt","a");
if(fichier==NULL)
{
return 0;
}
else
{
strcpy(c->nom,tab1);
strcpy(c->prenom,tab2);
c->monttant=valeur;
fprintf(fichier,"%-20s%-20s%-10f\n",c->prenom,c->nom,c->monttant);
fclose(fichier);
}
return 1;
}
//------------------------------------------------------------------------------
//fonction effacer----------------------------------------------
int eff(tcompte *c, char *tab1, char *tab2)
{
fichier=fopen("c:\\fichier.txt","r+");
if(fichier==NULL) //Si le fichier n'existe pas, on retourne une erreur
{
return 0;
}
rewind(fichier); //On se place au début du fichier
fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant);
while(!feof(fichier))
{
if(strcmp(c->nom,tab1)!=0 || strcmp(c->prenom,tab2)!=0)
{
fseek(fichier,-52,SEEK_CUR);
fprintf(fichier,"%-20s%-20s%-10f",c->prenom,c->nom,c->monttant);
}
fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant);
}
fclose(fichier);
return 1;
}
//------------------------------------------------------------------------
//fonction modifier------------------------------------------
int mod(tcompte *c, char *tab1, char *tab2, float valeur)
{
fichier=fopen("c:\\fichier.txt","r+"); //On ouvre en lecture+écriture
rewind(fichier); //On se place au début du fichier
if(fichier==NULL) //Si le fichier est vide, on retourne une erreur
{
return 0;
}
while(!feof(fichier))
{
fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant); //On lit les données
if(strcmp(c->nom,tab1)==0 && strcmp(c->prenom,tab2)==0)
{
if(valeur>c->monttant)
{
return 1; //La somme paye est trop grande
}
c->monttant=c->monttant-valeur;
printf("\tIl reste %f euros a payer a %s %s.\n\n",c->monttant, c->prenom,c->nom);
fseek(fichier,-52,SEEK_CUR);
fprintf(fichier,"%-20s%-20s%-10f\n",c->prenom,c->nom,c->monttant);
fclose(fichier);
return 2;
}
}
if(feof(fichier)!=0)
{
fclose(fichier);
return 3; //Si le compte n'existe pas on renvoie une erreur
}
return 0;
}
//----------------------------------------------------------------
//fonction afficher--------------------------------------
int aff(tcompte *c)
{
fichier=fopen("c:\\fichier.txt","r");
if(fichier==NULL) //Si le fichier est vide, on retourne une erreur
{
return 0;
}
while(!feof(fichier))
{
fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant);
c->nom[20]='\0';
c->prenom[20]='\0';
printf("\n\n\tPrenom: %s\n",c->prenom);
printf("\tNom: %s\n",c->nom);
printf("\tDette: %f\n\n",c->monttant);
}
fclose(fichier);
return 1;
}
//------------------------------------------------------------------------
Mon problème est donc de supprimer un ligne dans un fichier. Le programme doit pouvoir gérer des comptes donc encoder, modifier, supprimer et afficher le différents comptes...
Je met tout le code mais je pense que mon problème n'est présent que dans ma fonction servant justement, à supprimer une ligne...
Le problème est que quand je demande à supprimer un compte,
l'ordinateur s'arrête. Je pense que le problème vient du "fseek".
Comme nous avons à peine commencé la gestion des fichiers, notre prof nous a dit que le plus simple, pour commencer, serait d'écraser la ligne à supprimer par la ligne qui suit... C'est donc ce que j'ai essayé de faire mais je n'y suis pas parvenu.
Si c'est important de le préciser je travail sous borland.
Si quelqu'un pouvait m'aider, ce serait gentil. A bientôt et merci d'avance.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define max 10
FILE*fichier;
typedef struct
{
char nom[30];
char prenom[30];
float monttant;
int occupe;
}tcompte;
//prototype de la fonction encode----------------------------------
int encode(tcompte *c, char *tab1, char *tab2, float valeur);
//---------------------------------------------------------------------
//prototype de la fonction eff------------------------------
int eff(tcompte *c, char *tab1, char *tab2);
//------------------------------------------------------------------------------
//prototype de la fonction modifier------------------------
int mod(tcompte *c, char *tab1, char *tab2, float valeur);
//------------------------------------------------------------------------------
//prototype de la fonction afficher-------------------------
int aff(tcompte *c);
//------------------------------------------------------------------------------
void main()
{
clrscr();
tcompte c;
float m; /*monttant*/
char choix; /*différentes options*/
char n[30]; /*nom*/
char p[30]; /*prénom*/
// char pass[10]; /*mot de passe à trouver0*/
// char code[]={"shrek"};
printf("\n\t\tMENU\n\n");
printf("\te.Encoder un compte\n");
printf("\ts.Supprimer un compte\n");
printf("\tm.Modifier un compte\n");
printf("\ta.Afficher les comptes\n");
printf("\tq.Quitter le programme\n");
do
{
printf("\n\n\nFaites votre choix: ");
choix=getch();
printf("%c",choix);
switch (choix)
{
//ajouter un compte
case 'e': printf("\n\n\n\tEntrez le nom du client: ");
flushall();
scanf("%s",&n);
printf("\tEntrez le prenom du client: ");
flushall();
scanf("%s",&p);
printf("\tEntrez le montant restant a payer: ");
flushall();
scanf("%f",&m);
if(encode(&c,n,p,m)==0)
{
printf("\n\n\tOn ne peut plus encoder!!!\n\n\n");
}
else
{
printf("\n\n\tLe compte est bien encode\n\n\n");
}
break;
//effacer un compte
case 's': printf("\n\n\n\tEntrez le nom du client a effacer: ");
flushall();
scanf("%s",&n);
printf("\tEntrez le prenom du client a effacer: ");
flushall();
scanf("%s",&p);
if(eff(&c,n,p)==0)
{
printf("\n\n\tLe fichier n'exiqte pas!!!\n\n",p,n);
}
else
{
printf("\n\n\tLe compte de %s %s est bien efface.\n\n",p,n);
}
break;
//modifier un compte
case 'm': printf("\n\n\tEntrez le nom du client a modifier: ");
flushall();
scanf("%s",&n);
printf("\tEntrez le prenom du client a modifier: ");
flushall();
scanf("%s",&p);
printf("\n\nEntrez la somme paye: ");
flushall();
scanf("%f",&m);
switch(mod(&c,n,p,m))
{
case 0: printf("\n\n\tLe fichier n'a pu etre ouvert!!!\n\n");
break;
case 1: printf("\n\n\tLa somme a payer est trop grande\n\n");
break;
case 2: printf("\n\n\tLe compte est modifie\n");
break;
case 3: printf("\n\n\tIl n'y a pas de compte a ce nom!!!\n\n");
}
break;
//afficher les comptes
case 'a':
if(aff(&c)==0)
{
printf("\n\n\tIl n'y a aucun compte!!!\n\n");
}
else
{
printf("\tVoici le(s) compte(s)\n\n");
}
break;
case 'q':
break;
}
}
while(choix!='q');
}
//fonction encode--------------------------
int encode(tcompte *c, char *tab1, char *tab2, float valeur)
{
fichier=fopen("C:\\fichier.txt","a");
if(fichier==NULL)
{
return 0;
}
else
{
strcpy(c->nom,tab1);
strcpy(c->prenom,tab2);
c->monttant=valeur;
fprintf(fichier,"%-20s%-20s%-10f\n",c->prenom,c->nom,c->monttant);
fclose(fichier);
}
return 1;
}
//------------------------------------------------------------------------------
//fonction effacer----------------------------------------------
int eff(tcompte *c, char *tab1, char *tab2)
{
fichier=fopen("c:\\fichier.txt","r+");
if(fichier==NULL) //Si le fichier n'existe pas, on retourne une erreur
{
return 0;
}
rewind(fichier); //On se place au début du fichier
fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant);
while(!feof(fichier))
{
if(strcmp(c->nom,tab1)!=0 || strcmp(c->prenom,tab2)!=0)
{
fseek(fichier,-52,SEEK_CUR);
fprintf(fichier,"%-20s%-20s%-10f",c->prenom,c->nom,c->monttant);
}
fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant);
}
fclose(fichier);
return 1;
}
//------------------------------------------------------------------------
//fonction modifier------------------------------------------
int mod(tcompte *c, char *tab1, char *tab2, float valeur)
{
fichier=fopen("c:\\fichier.txt","r+"); //On ouvre en lecture+écriture
rewind(fichier); //On se place au début du fichier
if(fichier==NULL) //Si le fichier est vide, on retourne une erreur
{
return 0;
}
while(!feof(fichier))
{
fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant); //On lit les données
if(strcmp(c->nom,tab1)==0 && strcmp(c->prenom,tab2)==0)
{
if(valeur>c->monttant)
{
return 1; //La somme paye est trop grande
}
c->monttant=c->monttant-valeur;
printf("\tIl reste %f euros a payer a %s %s.\n\n",c->monttant, c->prenom,c->nom);
fseek(fichier,-52,SEEK_CUR);
fprintf(fichier,"%-20s%-20s%-10f\n",c->prenom,c->nom,c->monttant);
fclose(fichier);
return 2;
}
}
if(feof(fichier)!=0)
{
fclose(fichier);
return 3; //Si le compte n'existe pas on renvoie une erreur
}
return 0;
}
//----------------------------------------------------------------
//fonction afficher--------------------------------------
int aff(tcompte *c)
{
fichier=fopen("c:\\fichier.txt","r");
if(fichier==NULL) //Si le fichier est vide, on retourne une erreur
{
return 0;
}
while(!feof(fichier))
{
fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant);
c->nom[20]='\0';
c->prenom[20]='\0';
printf("\n\n\tPrenom: %s\n",c->prenom);
printf("\tNom: %s\n",c->nom);
printf("\tDette: %f\n\n",c->monttant);
}
fclose(fichier);
return 1;
}
//------------------------------------------------------------------------
A voir également:
- "Scanf(&s,&n)"
- Supprimer rond bleu whatsapp - Guide
- Fichier bin - Guide
- Impossible de supprimer un fichier - Guide
- Comment réduire la taille d'un fichier - Guide
- Comment ouvrir un fichier epub ? - Guide
6 réponses
Salut,
Ca y est j'ai une solution, mon prof m'a aidé à corriger mon code, je le mets donc au cas ou ça aiderait qqun d'autre.
Cette solution n'est évidemment pas la meilleur mais c'est la plus simple à comprendre (enfin je trouve).
Bref, c'est une solution!!!
Le code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
FILE*fichier;
typedef struct
{
char nom[30];
char prenom[30];
float monttant;
}tcompte;
//prototype de la fonction encode-----------------------------------------------
int encode(tcompte *c, char *tab1, char *tab2, float valeur);
//------------------------------------------------------------------------------
//prototype de la fonction eff--------------------------------------------------
int eff(tcompte *c, char *tab1, char *tab2);
//------------------------------------------------------------------------------
//prototype de la fonction modifier---------------------------------------------
int mod(tcompte *c, char *tab1, char *tab2, float valeur);
//------------------------------------------------------------------------------
//prototype de la fonction afficher---------------------------------------------
int aff(tcompte *c);
//------------------------------------------------------------------------------
//prototype de la fonction password---------------------------------------------
//int password(char *tab1, char *tab2);
void main()
{
tcompte c;
float m; /*monttant*/
char choix; /*différentes options*/
char n[30]; /*nom*/
char p[30]; /*prénom*/
system("cls");
printf("\n\t\tMENU\n\n");
printf("\te.Encoder un compte\n");
printf("\ts.Supprimer un compte\n");
printf("\tm.Modifier un compte\n");
printf("\ta.Afficher les comptes\n");
printf("\tq.Quitter le programme\n");
do
{
printf("\n\n\nFaites votre choix: ");
fflush(stdin);
choix=getch();
switch (choix)
{
//ajouter un compte
case 'e': printf("\n\n\n\tEntrez le nom du client: ");
scanf("%s",n); //erreur &n
printf("\tEntrez le prenom du client: ");
scanf("%s",p); //erreur &p
printf("\tEntrez le montant restant a payer: ");
scanf("%f",&m);
if(encode(&c,n,p,m)==0)
{
printf("\n\n\tOn ne peut plus encoder!!!\n\n\n");
}
else
{
printf("\n\n\tLe compte est bien encode\n\n\n");
}
break;
//effacer un compte
case 's': printf("\n\n\n\tEntrez le nom du client a effacer: ");
scanf("%s",n); //erreur
printf("\tEntrez le prenom du client a effacer: ");
scanf("%s",p); //erreur
if(eff(&c,n,p)==0)
{
printf("\n\n\tLe fichier n'exiqte pas!!!\n\n",p,n);
}
else
{
printf("\n\n\tLe compte de %s %s est bien efface.\n\n",p,n);
}
break;
//modifier un compte
case 'm': printf("\n\n\tEntrez le nom du client a modifier: ");
scanf("%s",&n);
printf("\tEntrez le prenom du client a modifier: ");
scanf("%s",&p);
printf("\n\nEntrez la somme paye: ");
scanf("%f",&m);
switch(mod(&c,n,p,m))
{
case 0: printf("\n\n\tLe fichier n'a pu etre ouvert!!!\n\n");
break;
case 1: printf("\n\n\tLa somme a payer est trop grande\n\n");
break;
case 2: printf("\n\n\tLe compte est modifie\n");
break;
case 3: printf("\n\n\tIl n'y a pas de compte a ce nom!!!\n\n");
}
break;
//afficher les comptes
case 'a' if(aff(&c)==0)
{
printf("\n\n\tIl n'y a aucun compte!!!\n\n");
}
else
{
printf("\tVoici le(s) compte(s)\n\n");
}
break;
case 'q':
break;
}
}
while(choix!='q');
}
//fonction encode---------------------------------------------------------------
int encode(tcompte *c, char *tab1, char *tab2, float valeur)
{
fichier=fopen("C:\\fichier.txt","a");
if(fichier==NULL)
{
return 0;
}
else
{
strcpy(c->nom,tab1);
strcpy(c->prenom,tab2);
c->monttant=valeur;
fprintf(fichier,"%-20s%-20s%-10f\n",c->prenom,c->nom,c->monttant);
fclose(fichier);
}
return 1;
}
//------------------------------------------------------------------------------
//fonction effacer--------------------------------------------------------------
int eff(tcompte *c, char *tab1, char *tab2)
{
int pos=0;
int trouve=0;
fichier=fopen("c:\\fichier.txt","r+");
if(fichier==NULL) //Si le fichier n'existe pas, on retourne une erreur
{
return 0;
}
rewind(fichier); //On se place au début du fichier
while(fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant)!=EOF)
{
if(strcmp(c->nom,tab1)==0 && strcmp(c->prenom,tab2)==0)
{
trouve=1;
break;
}
pos++;
}
if (trouve == 0) return 0;
printf("fiche trouvée\n");
while(fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant)!=EOF)
{
fseek(fichier,pos*52,SEEK_SET);
fprintf(fichier,"%-20s%-20s%-10f",c->prenom,c->nom,c->monttant);
pos++;
fseek(fichier,(pos+1)*52,SEEK_SET);
}
fseek(fichier,pos*52,SEEK_SET);
fprintf(fichier,"%c",26);
fclose(fichier);
return 1;
}
//------------------------------------------------------------------------------
//fonction modifier-------------------------------------------------------------
int mod(tcompte *c, char *tab1, char *tab2, float valeur)
{
fichier=fopen("c:\\fichier.txt","r+"); //On ouvre en lecture+écriture
rewind(fichier); //On se place au début du fichier
if(fichier==NULL) //Si le fichier est vide, on retourne une erreur
{
return 0;
}
while(!feof(fichier))
{
fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant); //On lit les données
if(strcmp(c->nom,tab1)==0 && strcmp(c->prenom,tab2)==0)
{
if(valeur>c->monttant)
{
return 1; //La somme paye est trop grande
}
c->monttant=c->monttant-valeur;
printf("\tIl reste %f euros a payer a %s %s.\n\n",c->monttant,c->prenom,c->nom);
fseek(fichier,-52,SEEK_CUR);
fprintf(fichier,"%-20s%-20s%-10f\n",c->prenom,c->nom,c->monttant);
fclose(fichier);
return 2;
}
}
if(feof(fichier)!=0)
{
fclose(fichier);
return 3; //Si le compte n'existe pas on renvoie une erreur
}
return 0;
}
//------------------------------------------------------------------------------
//fonction afficher-------------------------------------------------------------
int aff(tcompte *c)
{
fichier=fopen("c:\\fichier.txt","r");
if(fichier==NULL) //Si le fichier est vide, on retourne une erreur
{
return 0;
}
while(fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant)!=EOF)
{
c->nom[20]='\0';
c->prenom[20]='\0';
printf("\n\n\tPrenom: %s\n",c->prenom);
printf("\tNom: %s\n",c->nom);
printf("\tDette: %f\n\n",c->monttant);
}
fclose(fichier);
return 1;
}
//------------------------------------------------------------------------------
Ca y est j'ai une solution, mon prof m'a aidé à corriger mon code, je le mets donc au cas ou ça aiderait qqun d'autre.
Cette solution n'est évidemment pas la meilleur mais c'est la plus simple à comprendre (enfin je trouve).
Bref, c'est une solution!!!
Le code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
FILE*fichier;
typedef struct
{
char nom[30];
char prenom[30];
float monttant;
}tcompte;
//prototype de la fonction encode-----------------------------------------------
int encode(tcompte *c, char *tab1, char *tab2, float valeur);
//------------------------------------------------------------------------------
//prototype de la fonction eff--------------------------------------------------
int eff(tcompte *c, char *tab1, char *tab2);
//------------------------------------------------------------------------------
//prototype de la fonction modifier---------------------------------------------
int mod(tcompte *c, char *tab1, char *tab2, float valeur);
//------------------------------------------------------------------------------
//prototype de la fonction afficher---------------------------------------------
int aff(tcompte *c);
//------------------------------------------------------------------------------
//prototype de la fonction password---------------------------------------------
//int password(char *tab1, char *tab2);
void main()
{
tcompte c;
float m; /*monttant*/
char choix; /*différentes options*/
char n[30]; /*nom*/
char p[30]; /*prénom*/
system("cls");
printf("\n\t\tMENU\n\n");
printf("\te.Encoder un compte\n");
printf("\ts.Supprimer un compte\n");
printf("\tm.Modifier un compte\n");
printf("\ta.Afficher les comptes\n");
printf("\tq.Quitter le programme\n");
do
{
printf("\n\n\nFaites votre choix: ");
fflush(stdin);
choix=getch();
switch (choix)
{
//ajouter un compte
case 'e': printf("\n\n\n\tEntrez le nom du client: ");
scanf("%s",n); //erreur &n
printf("\tEntrez le prenom du client: ");
scanf("%s",p); //erreur &p
printf("\tEntrez le montant restant a payer: ");
scanf("%f",&m);
if(encode(&c,n,p,m)==0)
{
printf("\n\n\tOn ne peut plus encoder!!!\n\n\n");
}
else
{
printf("\n\n\tLe compte est bien encode\n\n\n");
}
break;
//effacer un compte
case 's': printf("\n\n\n\tEntrez le nom du client a effacer: ");
scanf("%s",n); //erreur
printf("\tEntrez le prenom du client a effacer: ");
scanf("%s",p); //erreur
if(eff(&c,n,p)==0)
{
printf("\n\n\tLe fichier n'exiqte pas!!!\n\n",p,n);
}
else
{
printf("\n\n\tLe compte de %s %s est bien efface.\n\n",p,n);
}
break;
//modifier un compte
case 'm': printf("\n\n\tEntrez le nom du client a modifier: ");
scanf("%s",&n);
printf("\tEntrez le prenom du client a modifier: ");
scanf("%s",&p);
printf("\n\nEntrez la somme paye: ");
scanf("%f",&m);
switch(mod(&c,n,p,m))
{
case 0: printf("\n\n\tLe fichier n'a pu etre ouvert!!!\n\n");
break;
case 1: printf("\n\n\tLa somme a payer est trop grande\n\n");
break;
case 2: printf("\n\n\tLe compte est modifie\n");
break;
case 3: printf("\n\n\tIl n'y a pas de compte a ce nom!!!\n\n");
}
break;
//afficher les comptes
case 'a' if(aff(&c)==0)
{
printf("\n\n\tIl n'y a aucun compte!!!\n\n");
}
else
{
printf("\tVoici le(s) compte(s)\n\n");
}
break;
case 'q':
break;
}
}
while(choix!='q');
}
//fonction encode---------------------------------------------------------------
int encode(tcompte *c, char *tab1, char *tab2, float valeur)
{
fichier=fopen("C:\\fichier.txt","a");
if(fichier==NULL)
{
return 0;
}
else
{
strcpy(c->nom,tab1);
strcpy(c->prenom,tab2);
c->monttant=valeur;
fprintf(fichier,"%-20s%-20s%-10f\n",c->prenom,c->nom,c->monttant);
fclose(fichier);
}
return 1;
}
//------------------------------------------------------------------------------
//fonction effacer--------------------------------------------------------------
int eff(tcompte *c, char *tab1, char *tab2)
{
int pos=0;
int trouve=0;
fichier=fopen("c:\\fichier.txt","r+");
if(fichier==NULL) //Si le fichier n'existe pas, on retourne une erreur
{
return 0;
}
rewind(fichier); //On se place au début du fichier
while(fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant)!=EOF)
{
if(strcmp(c->nom,tab1)==0 && strcmp(c->prenom,tab2)==0)
{
trouve=1;
break;
}
pos++;
}
if (trouve == 0) return 0;
printf("fiche trouvée\n");
while(fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant)!=EOF)
{
fseek(fichier,pos*52,SEEK_SET);
fprintf(fichier,"%-20s%-20s%-10f",c->prenom,c->nom,c->monttant);
pos++;
fseek(fichier,(pos+1)*52,SEEK_SET);
}
fseek(fichier,pos*52,SEEK_SET);
fprintf(fichier,"%c",26);
fclose(fichier);
return 1;
}
//------------------------------------------------------------------------------
//fonction modifier-------------------------------------------------------------
int mod(tcompte *c, char *tab1, char *tab2, float valeur)
{
fichier=fopen("c:\\fichier.txt","r+"); //On ouvre en lecture+écriture
rewind(fichier); //On se place au début du fichier
if(fichier==NULL) //Si le fichier est vide, on retourne une erreur
{
return 0;
}
while(!feof(fichier))
{
fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant); //On lit les données
if(strcmp(c->nom,tab1)==0 && strcmp(c->prenom,tab2)==0)
{
if(valeur>c->monttant)
{
return 1; //La somme paye est trop grande
}
c->monttant=c->monttant-valeur;
printf("\tIl reste %f euros a payer a %s %s.\n\n",c->monttant,c->prenom,c->nom);
fseek(fichier,-52,SEEK_CUR);
fprintf(fichier,"%-20s%-20s%-10f\n",c->prenom,c->nom,c->monttant);
fclose(fichier);
return 2;
}
}
if(feof(fichier)!=0)
{
fclose(fichier);
return 3; //Si le compte n'existe pas on renvoie une erreur
}
return 0;
}
//------------------------------------------------------------------------------
//fonction afficher-------------------------------------------------------------
int aff(tcompte *c)
{
fichier=fopen("c:\\fichier.txt","r");
if(fichier==NULL) //Si le fichier est vide, on retourne une erreur
{
return 0;
}
while(fscanf(fichier,"%[^ ] %[^ ] %f\n",c->prenom,c->nom,&c->monttant)!=EOF)
{
c->nom[20]='\0';
c->prenom[20]='\0';
printf("\n\n\tPrenom: %s\n",c->prenom);
printf("\tNom: %s\n",c->nom);
printf("\tDette: %f\n\n",c->monttant);
}
fclose(fichier);
return 1;
}
//------------------------------------------------------------------------------
Quand j'execute pas à pas, il plante justement sur le fseek.
En ce qui concerne le -52 qu'il soit la ou pas (avec ou sans le moins) ça plante.
Quand je ne met pas de fseek, le programme n'efface rien...
En ce qui concerne le -52 qu'il soit la ou pas (avec ou sans le moins) ça plante.
Quand je ne met pas de fseek, le programme n'efface rien...
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
-52 c'est pour dire que je reviens en arrière de 52 caractères (20 pour le premier champ, 20 pour le deuxième, 10 pour le troisième et 2 pour le caractère de passage à la ligne).
Une fois qu'une ligne du fichier est complète je dis que l'ordinateur doit passer automatiquement à la ligne suivante. Cette ligne qui vient d'être lu est la ligne à supprimer donc il faut revenir au début de cette dernière pour que l'ordinateur puisse la supprimer (ou, dans mon cas, réécrire dessus avec ligne du dessous) sans tucher aux suivantes.
Je ne sais pas vraiment comment on se sert de cette fonction parce que j'ai à peine vu le prototype mais le coup des -52 j'en suis certain.
Enfin voilà je crois que j'ai expliqué comme il faut... A plus.
Une fois qu'une ligne du fichier est complète je dis que l'ordinateur doit passer automatiquement à la ligne suivante. Cette ligne qui vient d'être lu est la ligne à supprimer donc il faut revenir au début de cette dernière pour que l'ordinateur puisse la supprimer (ou, dans mon cas, réécrire dessus avec ligne du dessous) sans tucher aux suivantes.
Je ne sais pas vraiment comment on se sert de cette fonction parce que j'ai à peine vu le prototype mais le coup des -52 j'en suis certain.
Enfin voilà je crois que j'ai expliqué comme il faut... A plus.
bon, tests suivant :
que te renvoie fseek?
essai cout<<fseek...
il y a peu être un problème de typage...
essai fseek(...,long(-52),...)
sinon, tu peux essayer fsetpos
description sur ce site : www.cppreference.com
Je ne suis pas sur qu'il y ai 2 caractères pour le passage à la ligne.
En effet j'ai lu quelque par sur ce forum que selon l'OS et /ou le type d'enregistrement, tu peut avoir les caractère ascii 10, ou 10 et 13(je ne suis plus sur du 13) ou seulement 13 etc...
à ta place j'esairai des fseek avec des 0, 1, -1... voir si ça plante.
que te renvoie fseek?
essai cout<<fseek...
il y a peu être un problème de typage...
essai fseek(...,long(-52),...)
sinon, tu peux essayer fsetpos
description sur ce site : www.cppreference.com
Je ne suis pas sur qu'il y ai 2 caractères pour le passage à la ligne.
En effet j'ai lu quelque par sur ce forum que selon l'OS et /ou le type d'enregistrement, tu peut avoir les caractère ascii 10, ou 10 et 13(je ne suis plus sur du 13) ou seulement 13 etc...
à ta place j'esairai des fseek avec des 0, 1, -1... voir si ça plante.