Liste chainée et gestion de fichier

bleuerouge Messages postés 12 Date d'inscription jeudi 7 janvier 2010 Statut Membre Dernière intervention 1 décembre 2014 - 11 janv. 2005 à 09:56
meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007 - 13 janv. 2005 à 14:07
Bonjour ,j'ai un big probleme en c je voudrai faire une gestion de carnet d'adresse ou des contact (struture TContact) serais des maillons d'un liste (structure TFiche_contact) que l'on remplirais avec un gestyion de fichier voici une partie code que j'ai deja fait:
typedef struct TContact
{
 char    Nom [20];
 char    Prenom [20];
 char    Adresse [50];
 int     Age;
 char    Telephone [15];
 char    Fonction [20];
 char    Mail [30];
 char    Date_de_naissance [20];
 struct TContact * ptsuivant;
}TContact;


// Structure des fiches de contact
typedef struct TFiche_contact
{
 struct TContact  *pt_tete;
    struct TFiche_contact *TFiche_suivante;
    
}TFiche_contact; 


//Autres variables
FILE *fp;
char filename [256];
char new_fichier [20];


/////////////////////////////////////////////  FONCTIONS /////////////////////////////////////


//  *************** Gestion des contacts ***************


//Fonction qui trouve le dernier contact
TContact * Trouver_dernier_Contact (TFiche_contact * une_fiche)
{
 TContact *  pt_test=une_fiche->pt_tete;  // pointeur qui va tester le maillon
 
 if (pt_test!=NULL)        // renvoie NULL si vide
 // return NULL;
 {
 while (pt_test->ptsuivant!=NULL)
  pt_test=pt_test->ptsuivant;
 } 
 return pt_test; 
}


//Fonction qui trouve l'avant dernier contact
TContact* Trouver_avant_dernier_Contact (TFiche_contact * une_fiche)
{
 TContact *  pt_test;      // pointeur qui va parcourir la fiche
 TContact *  pt_test_qui_suit;    // pointeur qui suit derriere


 pt_test=une_fiche->pt_tete;
 pt_test_qui_suit=pt_test;


 if (pt_test==NULL)        // renvoie NULL si vide
  return NULL;
 
 while (pt_test->ptsuivant!=NULL)
  {
   pt_test_qui_suit=pt_test;
   pt_test=pt_test->ptsuivant;
  }
 return pt_test_qui_suit; 
}



void Ajouter_contact_dans_fiche(TContact * nvelle_fiche_a_ajouter,TFiche_contact * une_fiche )  //Fonction qui permet d'ajouter un contact
{


 TContact * dernier_contact_de_fiche;
    
 /*dernier_contact_de_fiche=Trouver_dernier_Contact (une_fiche);


 dernier_contact_de_fiche->ptsuivant=nvelle_fiche_a_ajouter;
 nvelle_fiche_a_ajouter->ptsuivant=NULL;*/
 
 if (une_fiche->pt_tete==NULL)
  une_fiche->pt_tete=nvelle_fiche_a_ajouter;
 else
  {
  dernier_contact_de_fiche=Trouver_dernier_Contact (une_fiche);
  dernier_contact_de_fiche->ptsuivant=nvelle_fiche_a_ajouter;
  }


 
}


//Fonction qui permet d'enlever un contact 
void Enlever_Contact_dans_fiche (TFiche_contact * une_fiche)
{
 if (une_fiche->pt_tete!=NULL)         // Si une fiche n'est pas vide
 {
  TContact * pt_dernier=Trouver_dernier_Contact(une_fiche); // Pointeur sur dernier contact de la fiche
 
  if (pt_dernier==une_fiche->pt_tete)
  {
   une_fiche->pt_tete=NULL;        // Un seul contact dans la liste
  }
  else
  {
   TContact * pt_avant_dernier=Trouver_avant_dernier_Contact (une_fiche);
   pt_avant_dernier->ptsuivant=NULL;      // Pointeur sur l'avant dernier contact de la liste
  }
 }
}


//Fonction qui permet d'afficher les contacts
void Afficher_fiche(TFiche_contact * une_fiche)
{
 TContact * contact=une_fiche->pt_tete;       // Contact parcourant la fiche
 int num_enregistrement=0;          // numero d'enregistrement


 while (contact !=NULL)
 {
  printf("\n Enregitrement %d \n\n",num_enregistrement);
  printf("\nNom: %s \n",contact->Nom);
  printf("\nPrenom: %s \n",contact->Prenom);
  printf("\nAge: %d \n",contact->Age);
  printf("\nAdresse: %s \n",contact->Adresse);
  printf("\nTelelphone: %s \n",contact->Telephone);
  printf("\nFonction: %s \n",contact->Fonction);
  printf("\nMail: %s \n",contact->Mail);
 }


 printf("\n\nFin de la fiche\n");
}



//  *************** Gestion des fiches ***************



int Creer_fichier (char nom_du_fichier[])       //Fonction qui permet de créer une fiche
{
 FILE *fp;              // Pointeur de file


 strcat(nom_du_fichier ,".eca");
    fp=fopen(nom_du_fichier,"w");
           


 if (fp==NULL)
 {
  printf("\n\b Impossible de creer nouvelle fiche\n");
  return 0;
 }
 
 else 


 {
  printf("\nFichier %s cree",nom_du_fichier);
     fprintf(fp,"eca 1");
  fclose(fp);
        system("\n\npause");
  return 1;
 }
}



//Fonction qui permet d'ouvrir un fichier
int Ouvrir_fichier (char nom_du_fichier[] , TFiche_contact * une_fiche)
{


 FILE *fp;          // Pointeur du fichier courrant
 char test[15];
 int c;
 TContact* nouvelle_fiche;


 strcat(nom_du_fichier ,".eca");     // Ajoute l'extention au nom de la fiche
 fp = (fopen(nom_du_fichier ,"r"));
  
 if( fp== NULL)          // Retourne NULL si existe pas
 {
  printf("\a\nFichier introuvable\n");
  return 0;
 }
 
 fgets (test,6,fp);
 
 if (strcmp(test,"eca 1"))
    {
        printf("\a\nFichier non valide");
        fclose(fp);
        return 0;
    }



 while (!feof(fp))
 {
  nouvelle_fiche=((TContact*)malloc(sizeof(TContact))); 
  nouvelle_fiche->ptsuivant= NULL;


  /*fgets (nouvelle_fiche->Nom, sizeof(buffer), fp);
        fgets (nouvelle_fiche->Prenom, sizeof(buffer), fp);
        fgets (nouvelle_fiche->Adresse, sizeof(buffer), fp);
        fgets (nouvelle_fiche->Age, sizeof(buffer), fp);
        fgets (nouvelle_fiche->Telephone, sizeof(buffer), fp);
        fgets (nouvelle_fiche->Fonction, sizeof(buffer), fp);
  */
  
  fscanf(fp,"%s %s %s %i %s %s %s %s ",
   nouvelle_fiche->Nom,
   nouvelle_fiche->Prenom,
   nouvelle_fiche->Adresse,
   nouvelle_fiche->Age,
   nouvelle_fiche->Telephone,
   nouvelle_fiche->Fonction,
   nouvelle_fiche->Mail,
   nouvelle_fiche->Date_de_naissance); 
  
   Ajouter_contact_dans_fiche(nouvelle_fiche,une_fiche);


 }


 fclose (fp);


return 1;


}

Hors ma liste chaionée ne marche âs ,a partir du moment que j'utilise ouvrir fichier ,j'ai un acces violation au niveau de la fonction trouver_dernier_contact ()
Apres je n'arrive plus a m'y retrouver et je n'ai plus beaucoup de temps est ce que quelqu'un pourrait m'aider a comprendre mes erruer
mille merci d'avance

1 réponse

meech Messages postés 209 Date d'inscription vendredi 11 avril 2003 Statut Membre Dernière intervention 14 août 2007
13 janv. 2005 à 14:07
Salut,

Peux-tu faire tourner un zip avec l'ensemble de ton code source (fonction main, exemple de fichiers de contacts, etc.) <[mailto:fx.michaud@laposte.net fx.michaud@laposte.net]> ?
Et pour tester dans des conditions réelles, c'est en ANSI C sous Linux ?

En espérant t'aider,
Ciao.
0
Rejoignez-nous