urgent SVP prog d un annuaire en C

urgent SVP prog d un annuaire en C - Programmation

Marsh Posté le 08-02-2002 à 23:09:09    

voila j ai fait pour mon projet de prog un annuaire en C que je dois envoyer a mon prof avant 00.00
mais le pb c que le chargement merde et j ai passe 5 h dessus et j ai pas trouve le pb :(
en fait si je laisse des champs libres, a la sauvegarde ca passe mais au chargement il decale tout et je peux me retrouver avec la valeur de l adresse pour le prenom ...
sinon aussi je ne peux pas modifier les fiches que j ai charger ..
je ne comprend pas ..
Merci a vous .
 
PS je compile sous Visual Basic
 
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
 
 
typedef struct fiche {
 char nom[50];
 char prenom[50];
 char tel[25];
 char fax[25];
 char portable[25];
 char adresse[50];
 char email[50];
 struct fiche* suivant; } fich;
 
typedef struct {
 fich * debut;
 fich * fin;
 int nbfiches; } liste;
 
/********************sous-programme d'initialisation*****************/
 
liste * init(liste * pers) {
 pers=(liste*)malloc(sizeof(liste));
 pers->debut=(fich*)malloc(sizeof(fich));
 pers->fin=(fich*)malloc(sizeof(fich));
 pers->nbfiches=0;
 pers->fin->suivant=NULL;
 pers->debut->suivant=pers->fin;
 return (pers);  
}
 
 
 
/********************sous-programme de sauvegarde sur disque********************/
 
 
void sauver(liste*pers)
{
 FILE*fp;
 fich*tmp;
 fp=fopen("annu.txt","w" );
 tmp=(fich*)malloc(sizeof(fich));
 tmp=pers->debut->suivant;
 fprintf(fp,"%d\n",pers->nbfiches);
 while(tmp->suivant!=NULL)
  {
  fprintf(fp,"%s\n",tmp->nom);
  fprintf(fp,"%s\n",tmp->prenom);
  fprintf(fp,"%s\n",tmp->tel);  
  fprintf(fp,"%s\n",tmp->fax);
  fprintf(fp,"%s\n",tmp->portable);
  fprintf(fp,"%s\n",tmp->adresse);  
  fprintf(fp,"%s\n",tmp->email);
  tmp=tmp->suivant;
  }
 fprintf(fp,"%d\n",pers->nbfiches);
 fclose(fp);
}
 
/********************sous-programme de chargement sur disque********************/
 
void charger (liste* pers){
 fich* tmp;
 FILE* fp;
 int i,j,k;
 fp=fopen("annu.txt","r" );
 tmp=pers->debut;
 k=pers->nbfiches;
 fscanf(fp,"%d\n",&pers->nbfiches);
 j=pers->nbfiches;
 for(i=0;i<k;i++) tmp=tmp->suivant;
 for(i=0;i<j;i++) {
  fich * nouv;
  nouv=(fich*)malloc(sizeof(fich));
  fgets(nouv->nom,50,fp);
  fgets(nouv->prenom,50,fp);
  fgets(nouv->tel,25,fp);
  fgets(nouv->fax,25,fp);
  fgets(nouv->portable,25,fp);
  fgets(nouv->adresse,50,fp);
  fgets(nouv->email,50,fp);
  tmp->suivant=nouv;
  tmp=nouv;
 }
 fclose(fp);
 pers->nbfiches=(pers->nbfiches)+k;
}  
 
 
 
/********************sous-programme d'ajout en tete***************/
 
void ajout_en_tete(liste*pers) {
 fich * nouv;
 nouv=(fich*)malloc(sizeof(fich));
 system("cls" );
 printf("Saisir le nom.\n" );
 fflush(stdin);
 gets(nouv->nom);
 printf("Saisir le prenom.\n" );
 gets(nouv->prenom);
 printf("Saisir le telephone.\n" );
 gets(nouv->tel);
 printf("Saisir le fax.\n" );
 gets(nouv->fax);
 printf("Saisir le numero de portable.\n" );
 gets(nouv->portable);
 printf("Saisir l adresse.\n" );
 gets(nouv->adresse);
 printf("Saisir l email.\n" );
 gets(nouv->email);
 nouv->suivant=pers->debut->suivant;
 pers->debut->suivant=nouv;
 pers->nbfiches ++;
 
}
 
/********************sous-programme d'ajout en queue********************/
 
void ajout_en_queue(liste*pers) {
 fich * nouv;
 fich * tmp=NULL;
 int i;
 nouv=(fich*)malloc(sizeof(fich));
 system("cls" );
 printf("Saisir nom.\n" );
 fflush(stdin);
 gets(nouv->nom);
 printf("Saisir prenom.\n" );
 gets(nouv->prenom);
 printf("Saisir le telephone.\n" );
 gets(nouv->tel);
 printf("Saisir le fax.\n" );
 gets(nouv->fax);
 printf("Saisir le numero de portable.\n" );
 gets(nouv->portable);
 printf("Saisir l adresse.\n" );
 gets(nouv->adresse);
 printf("Saisir l email.\n" );
 gets(nouv->email);
 nouv->suivant=pers->fin;
 tmp=pers->debut;
 pers->nbfiches ++;
 for(i=0;i<(pers->nbfiches-1);i++) tmp=tmp->suivant;
 tmp->suivant=nouv;
}
 
/********************sous-programme d'ajout ********************/
 
void ajout(liste*pers) {
 int c;
 system("cls" );
 do {
  printf("\nPour ajouter une fiche en tete taper 1.\n\nPour ajouter une fiche en fin taper 2.\n\nPour sortir taper 0.\n\n" );
  scanf("%d",&c);
  fflush(stdin);
  switch(c) {
  case 1 : ajout_en_tete(pers);
   break;
  case 2 : ajout_en_queue(pers);
   break;
  case 0 : break;
  }
 } while (c!=0);
 system("cls" );
}
 
/********************sous-programme de tri par nom********************/
 
void trier_nom(liste*pers) {
 int i;
 fich * tmp1;
 fich * tmp2;
 fich * tmp3;
 tmp1=pers->debut;
 tmp2=tmp1->suivant;
 tmp3=tmp2->suivant;
 for(i=0;i<pers->nbfiches;i++) {
  while(tmp3!=NULL) {
   if(strcmp(tmp2->nom,tmp3->nom)>0) {
    tmp2->suivant=tmp3->suivant;
    tmp1->suivant=tmp3;
    tmp3->suivant=tmp2;  
    tmp1=tmp3;
    tmp3=tmp2->suivant; }
   else {
    tmp1=tmp2;
    tmp2=tmp3;
    tmp3=tmp3->suivant; }  
  }
 }
 system("cls" );
}
 
/********************sous-programme de tri par prenom********************/
 
void trier_prenom(liste*pers) {
 int i;
 fich * tmp1;
 fich * tmp2;
 fich * tmp3;
 tmp1=pers->debut;
 tmp2=tmp1->suivant;
 tmp3=tmp2->suivant;
 for(i=0;i<pers->nbfiches;i++) {
  while(tmp3!=NULL) {
   if(strcmp(tmp2->prenom,tmp3->prenom)>0) {
    tmp2->suivant=tmp3->suivant;
    tmp1->suivant=tmp3;
    tmp3->suivant=tmp2;  
    tmp1=tmp3;
    tmp3=tmp2->suivant; }
   else {
    tmp1=tmp2;
    tmp2=tmp3;
    tmp3=tmp3->suivant; }  
  }
 }
 system("cls" );
}
 
/********************sous-programme de tri********************/
 
void trier(liste*pers) {
int i,c;
 system("cls" );
 printf("\nPour trier les fiches par nom appuyer sur 1.\n\nPour trier les fiches par prenom appuyer sur 2.\n\nPour sortir appuyer sur 0.\n\n" );
 scanf("%d",&c);
 fflush(stdin);
 switch(c) {
  case 1 : for(i=0;i<pers->nbfiches;i++) trier_nom(pers);
   break;
  case 2 : for(i=0;i<pers->nbfiches;i++) trier_prenom(pers);
   break;
  case 3 : break;
  }
 system("cls" );
}
 
/********************sous-programme d affichage du repertoire********************/
 
void afficher(liste*pers) {
 fflush(stdin);
 system("cls" );
 fiche * tmp;
 int i;
 tmp=pers->debut->suivant;
 if (pers->nbfiches>0) {
   for(i=0;i<pers->nbfiches;i++) {
   printf ("\n\nNom  : %s \nPrenom  : %s \nNumero de telephone  : %s\nNumero de fax : %s\nNumero de portable  : %s\nAdresse : %s\nEmail : %s\n",tmp->nom,tmp->prenom,tmp->tel,tmp->fax,tmp
 
->portable,tmp->adresse,tmp->email);
   tmp=tmp->suivant;printf("\n" );  
   getch();
  }
 }
 else printf("Il n y a pas de fiches a afficher.\n" );
}
 
 
//********************sous-programme d affichage d'une des fiches********************/
 
void affich(liste*pers) {
 fich*tmp=pers->debut;
 char nam [50];
 int decision=0;
 int choix,c,d;
 printf("Pour chercher par nom taper 1, par prenom taper 2 ou par numero de telephone taper 3.\n" );
 fflush(stdin);
 scanf("%d",&d);
 
 switch(d) {
  case 1 : {
  printf("Entrez le nom de famille de la personne dont la fiche doit etre modifie\n" );
  fflush(stdin);
  gets(nam);
  while(tmp->suivant!=NULL) {
   if (strcmp(nam,tmp->suivant->nom)== 0) {
    printf("Nous avons trouve une fiche correspondant a ce nom.\n" );
    printf("\nIl s'agit de:\n" );
    printf("nom : %s\nprenom : %s\ntelephone : %s\n",tmp->suivant->nom,tmp->suivant->prenom,tmp->suivant->tel);
    printf("portable : %s\nfax : %s\nadresse : %s\n",tmp->suivant->portable,tmp->suivant->fax,tmp->suivant->adresse);
    printf("Que voulez-vous faire de cette fiche\n\n1:Supprimer.\n\n2:Modifier.\n\n0:Qu
 
itter.\n" );
    scanf("%d",&c);
    fflush(stdin);
     switch(c) {
      case 1 : {
       tmp->suivant=tmp->suivant->suivant;
       pers->nbfiches--;
       break;
        }
 
      case 2 : {
        do{
         fflush(stdin);
         printf("Quel champ désirez-vous modifier\n1:Nom\t2:Prenom\t3:Telephone\n" );
         printf("4:Portable\t5:Fax\t6:Adresse\t7
 
:E-mail\n0:Quitter\n" );
         scanf("%d",&choix);
         switch(choix) {
          case 1:
           {
           fflush(stdin);
           printf("Entrez le nouveau nom de famille de l'actuel:%s\n", tmp->suivant->nom);
           gets(tmp->suivant->nom);
           break;
           }
          case 2:
           {
           fflush(stdin);
           printf("Entrez le nouveau prenom de l'actuel:%s\n", tmp->suivant->prenom);
           gets(tmp->suivant->prenom);
           break;
           }
          case 3:
           {
           fflush(stdin);
           printf("Entrez le nouveau numero actuellement:%s\n", tmp->suivant->tel);
           gets(tmp->suivant->tel);
           break;
           }
          case 4:
           {
           fflush(stdin);
           printf("Entrez le nouveau numero de portable actuellement:%s\n", tmp->suivant->portable);
           gets(tmp->suivant->portable);
           break;
           }
          case 5:
           {
           fflush(stdin);
           printf("Entrez le nouveau numero de fax actuellement:%s\n", tmp->suivant->fax);
           gets(tmp->suivant->fax);
           break;
           }
          case 6:
           {
           fflush(stdin);
           printf("Entrez la nouvelle adresse actuellement :%s\n", tmp->suivant->adresse);
           gets(tmp->suivant->adresse);
           break;
           }
          case 7:
           {
           fflush(stdin);
           printf("Entrez le nouvel email actuellement:%s\n", tmp->suivant->email);
           gets(tmp->suivant->email);
           break;
           }
          case 0: break;
          }
     }while (choix != 0);
     break;
    }
    case 0 : break;
   }
  }
 tmp=tmp->suivant;
 }
 printf("Il n'y a plus personne sous cette identite.\n" );
 break;
}
   
 
  case 2 : {
  printf("Entrez le prenom de la personne dont la fiche doit etre modifie\n" );
  fflush(stdin);
  gets(nam);
  while(tmp->suivant!=NULL) {
   if (strcmp(nam,tmp->suivant->prenom)== 0) {
    printf("nous avons trouve une fiche correspondant a ce prenom." );
    printf("\nIl s'agit de:\n" );
    printf("nom : %s\nprenom : %s\ntelephone : %s\n",tmp->suivant->nom,tmp->suivant->prenom,tmp->suivant->tel);
    printf("portable : %s\nfax : %s\nadresse : %s\n",tmp->suivant->portable,tmp->suivant->fax,tmp->suivant->adresse);
    printf("Que voulez-vous faire de cette fiche\n\n1:Supprimer.\n\n2:Modifier.\n\n0:Qu
 
itter.\n" );
    scanf("%d",&c);
    fflush(stdin);
     switch(c) {
      case 1 : {
       tmp->suivant=tmp->suivant->suivant;
       pers->nbfiches--;
       break;
         }
 
      case 2 : {
        do{
         fflush(stdin);
         printf("Quel champ désirez-vous modifier\n1:Nom\t2:Prenom\t3:Telephone\n" );
         printf("4:Portable\t5:Fax\t6:Adresse\t7
 
:E-mail\n0:Quitter\n" );
         scanf("%d",&choix);
         switch(choix) {
          case 1:
           {
           fflush(stdin);
           printf("Entrez le nouveau nom de famille de l'actuel:%s\n", tmp->suivant->nom);
           gets(tmp->suivant->nom);
           break;
           }
          case 2:
           {
           fflush(stdin);
           printf("Entrez le nouveau prenom de l'actuel:%s\n", tmp->suivant->prenom);
           gets(tmp->suivant->prenom);
           break;
           }
          case 3:
           {
           fflush(stdin);
           printf("Entrez le nouveau numero actuellement:%s\n", tmp->suivant->tel);
           gets(tmp->suivant->tel);
           break;
           }
          case 4:
           {
           fflush(stdin);
           printf("Entrez le nouveau numero de portable actuellement:%s\n", tmp->suivant->portable);
           gets(tmp->suivant->portable);
           break;
           }
          case 5:
           {
           fflush(stdin);
           printf("Entrez le nouveau numero de fax actuellement:%s\n", tmp->suivant->fax);
           gets(tmp->suivant->fax);
           break;
           }
          case 6:
           {
           fflush(stdin);
           printf("Entrez la nouvelle adresse actuellement :%s\n", tmp->suivant->adresse);
           gets(tmp->suivant->adresse);
           break;
           }
          case 7:
           {
           fflush(stdin);
           printf("Entrez le nouvel email actuellement:%s\n", tmp->suivant->email);
           gets(tmp->suivant->email);
           break;
           }
          case 0: break;
          }
         }while (choix != 0);
        break;
         }
      case 0 : break;
     }
    }
    tmp=tmp->suivant;
   }
   printf("Il n'y a plus personne sous cette identite.\n" );
   break;
  }
 
  case 3 : {
  printf("Entrez le numero de telephone de la personne dont la fiche doit etre modifie\n" );
  fflush(stdin);
  gets(nam);
  while(tmp->suivant!=NULL) {
   if (strcmp(nam,tmp->suivant->tel)== 0) {
    printf("nous avons trouve une fiche correspondant a ce numero." );
    printf("\nIl s'agit de:\n" );
    printf("nom : %s\nprenom : %s\ntelephone : %s\n",tmp->suivant->nom,tmp->suivant->prenom,tmp->suivant->tel);
    printf("portable : %s\nfax : %s\nadresse : %s\n",tmp->suivant->portable,tmp->suivant->fax,tmp->suivant->adresse);
    printf("Que voulez-vous faire de cette fiche\n\n1:Supprimer.\n\n2:Modifier.\n\n0:Qu
 
itter.\n" );
    scanf("%d",&c);
    fflush(stdin);
     switch(c) {
      case 1 : {
       tmp->suivant=tmp->suivant->suivant;
       pers->nbfiches--;
       break;
         }
 
      case 2 : {
        do{
         fflush(stdin);
         printf("Quel champ désirez-vous modifier\n1:Nom\t2:Prenom\t3:Telephone\n" );
         printf("4:Portable\t5:Fax\t6:Adresse\t7
 
:E-mail\n0:Quitter\n" );
         scanf("%d",&choix);
         switch(choix) {
          case 1:
           {
           fflush(stdin);
           printf("Entrez le nouveau nom de famille de l'actuel:%s\n", tmp->suivant->nom);
           gets(tmp->suivant->nom);
           break;
           }
          case 2:
           {
           fflush(stdin);
           printf("Entrez le nouveau prenom de l'actuel:%s\n", tmp->suivant->prenom);
           gets(tmp->suivant->prenom);
           break;
           }
          case 3:
           {
           fflush(stdin);
           printf("Entrez le nouveau numero actuellement:%s\n", tmp->suivant->tel);
           gets(tmp->suivant->tel);
           break;
           }
          case 4:
           {
           fflush(stdin);
           printf("Entrez le nouveau numero de portable actuellement:%s\n", tmp->suivant->portable);
           gets(tmp->suivant->portable);
           break;
           }
          case 5:
           {
           fflush(stdin);
           printf("Entrez le nouveau numero de fax actuellement:%s\n", tmp->suivant->fax);
           gets(tmp->suivant->fax);
           break;
           }
          case 6:
           {
           fflush(stdin);
           printf("Entrez la nouvelle adresse actuellement :%s\n", tmp->suivant->adresse);
           gets(tmp->suivant->adresse);
           break;
           }
          case 7:
           {
           fflush(stdin);
           printf("Entrez le nouvel email actuellement:%s\n", tmp->suivant->email);
           gets(tmp->suivant->email);
           break;
           }
          case 0: break;
           }
         }while (choix != 0);
        break;
         }
      case 0 : break;
     }
    }
   tmp=tmp->suivant;
   }
  printf("Il n'y a plus personne sous ce numero.\n" );
  break;
  }
 }
}        
        /****************************
        ***                       ***
        **   PROGRAMME PRINCIPAL   **  
        ***                       ***
        ****************************/
 
void main () {
 liste * pers=NULL;
 int c,choixr,fini;
 pers=init(pers); /* initialisation de la liste */
 system("cls" );
 getch();
 system("cls" );
 do {  
  printf("\n\n\t\t\tBienvenue dans LANUX V1.0a.\n\n" );
  printf("\nVous avez actuellement %d fiches dans votre repertoire.\n",pers->nbfiches);
  printf("\nQue desirez-vous faire ?\n\n1 : Charger votre repertoire.\n2 : Ajouter une fiche au debut ou a la fin.\n3 : Trier par nom ou par prenom.\n4 : Afficher toutes les fiches.\n5 : Rechercher une fiche,l'afficher, la modifier ou la supprimer.\n6 : Sauvegarder votre repertoire.\n7 : Reinitialiser votre repertoire a zero.\n0 : Terminer votre programme.\n" );
  scanf("%d",&c);
  fflush(stdin);
  switch(c) {
   
   case 1 : charger(pers);
    break;
 
   case 2 : ajout(pers);
    break;
   case 3 :  
    if (pers->nbfiches==0)
     {
     printf("Il n'y a pas de fiche dans votre repertoire.\n" );
     getch();
     system("cls" );
 
     }
    else trier(pers);    
    break;
   case 4 :  
    if (pers->nbfiches==0)
    {
     printf("Il n'y a pas de fiche dans votre repertoire.\n" );
     getch();
     system("cls" );
     }
    else afficher(pers);
    break;
   case 5 :  
    if (pers->nbfiches==0)
     {
     printf("Il n'y a pas de fiche dans votre repertoire.\n" );
     getch();
     system("cls" );
     }
    else affich(pers);
    break;
   case 6  : sauver(pers);
    break;
   case 7 : {  
    if (pers->nbfiches==0) {  
     printf("Il n'y a pas de fiches dans le repertoire" );
     getch();
     system("cls" );}
 
    else {
     printf("Etes-vous sur de detruire toutes vos %d fiche(s)?",pers->nbfiches);
     printf("taper 0 pour confirmer\n" );
     printf("taper tout autre chiffre pour annuler\n" );
     scanf("%d",&choixr);
     if(choixr) printf("\nla reinitialisation a ete annulee" );
     else {
      pers=init(pers);
      printf("votre repertoire a ete reinitialise\n" );  
      }
     getch();
     system("cls" );
     }
    break; }
   
   case 0 :  
    {
     printf("\nDesirez-vous enregistrer avant de partir ?\n\nPour sauvegarder et quitter taper 1.\n" );
     printf("Pour quitter sans sauvegarder taper tout autre caractere.\n" );
     scanf("%d",&fini);
     switch (fini)
      {
       case 1 :  
       sauver(pers);
       printf("Votre sauvegarde a reussi." );
       getch();
       break;
 
       }
 
 
    system("cls" );
    printf("\n\n\n\n\n\n\n\n\n\n\n\t\t\t\tMerci de votre confiance.\n\n\n" );
    break;
    }
  }
 }
 while (c!=0);
}

 

[jfdsdjhfuetppo]--Message édité par gee--[/jfdsdjhfuetppo]


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 08-02-2002 à 23:09:09   

Reply

Marsh Posté le 08-02-2002 à 23:39:35    

svp snif


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 09-02-2002 à 01:10:12    

J'ai jeté un rapide coup d'oeuil a ton code parcequ'il est deja tard. L'utilisation de fgets me semble un peu douteuse :
 
       fgets()  reads  in  at  most one less than size characters
       from stream and stores them into the buffer pointed to  by
       s.  Reading stops after an EOF or a newline.  If a newline
       is read, it is stored into the buffer.  A '\0'  is  stored
       after the last character in the buffer.
 
Donc, ton prog de chargement met des \n à la fin de tes chaines de caracteres. Ce qui potentiellement peut faire que ton tableau de char soit trop petit. En effet, si un des champs à juste la taille max soit 49 pour nom + le \0, toi tu ecris sur le disque 50 characteres : le nom + le \n. Apres ton programme de chargement va lire au plus 49 chars et donc il va s'arreter juste avant le \n. Puis a l'appel suivant il va lire ce \n et l'interpreter comme une ligne vide ce qui peut creer un décalage dans tes colonnes.

Reply

Marsh Posté le 09-02-2002 à 01:37:57    

vi c ca le pb pour le decalage mais je sais pas comment le resoudre :)
enfin merci qd mm :)
je l ai envoye avec qq pbs .. :)


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Marsh Posté le 09-02-2002 à 15:53:52    

J'ai pas eu le temps de lire ton code, mais pour le \n y'a un truc simple :
fgets(file, chaine, size);
chaine[strlen(chaine)-1)] = '\0';
Et hpo, plus de \n, ta chaine est raccourcie d'un caractere.


---------------
Au royaume des sourds, les borgnes sont sourds.
Reply

Marsh Posté le 09-02-2002 à 17:13:15    

Oui mais ca resoud qu'une partie du probleme :)
 
Pour le résoudre completement, tu augmentes ton tampon de 1 caractère, et tu fait ton fgets avec 50 au lieu de 49. Comme ca tu est sur de lire le \n final même si le nom fesait 49 chars de long. Combine les 2 méthodes et c'est bon.

Reply

Marsh Posté le 09-02-2002 à 18:08:53    

ok :)


---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed