Liste chainées et fichier

didy_gwatinik Messages postés 358 Statut Membre -  
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour,
Je viens de finir un carnet d'adresses en C. Je l'ai fait avec des listes chainées. Je passe un exame à la fin de l'année et j'aimerai le présenter. Cependant, il faut que j'utilise les fichiers. Je ne vois pas du tout à quel moment manipuler les fichiers. L'utilisateur rentre les informations d'un premier contact sauvegardées dans une liste chaînée, je les sauvegarde directement dans le fichier? Je ne vois pas l'intérêt des fichiers dans ce cas là.
Si quelqu'un pouvait m'éclairer...
A voir également:

7 réponses

Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
?
soit plus clair.
L'intéret des fichiers c'est de pouvoir conserver des données saisies par l'utilisateur.
Lors du lancement du programme du charge un fichier, qui te donne une liste, l'utilisateur la modifie et tu écrase le fichier avec les nouvelles informations.
0
didy_gwatinik Messages postés 358 Statut Membre 80
 
En fait j'ai trouvé mais j'ai un gros soucis avec ma fonction enregistrement, elle enregistre tout sauf le nom voilà le code :
void enregistrement()
{
     FILE *fichier = NULL;//initialisation du pointeur sur fichier
     int i=0;
     fichier=fopen(chemin,"w"); //w pour ecraser l'ancien enregistrement et pour creer un nouveau fichier s'il n'existe pas
     if (fichier != NULL)
     {
                 fprintf(fichier,"%d",nbContact);
                 fprintf(fichier,"\n");
                 pc=start;
                 do{
                          fin=pc->next;
                          fprintf(fichier,pc->nom);
                          fprintf(fichier,"\n");
                          fprintf(fichier,pc->prenom);
                          fprintf(fichier,"\n");
                          fprintf(fichier,pc->numTel);
                          fprintf(fichier,"\n");
                          fprintf(fichier,pc->mel);
                          fprintf(fichier,"\n");
                          fprintf(fichier,pc->motdepasse);
                          fprintf(fichier,"\n");
                          pc=pc->next;
                 }while(fin!=NULL);
    
     fclose(fichier);
     } 
}

Pour la saisie , le code est le suivant :
void saisie()
{

pc=(struct contact *)malloc(sizeof(struct contact));
         //On rajoute de la place sur la structure
      memoireTampon();
      puts("NOM : ");
      gets(pc->nom);
      puts("PRENOM : ");
      gets(pc->prenom);
      do{
      puts("NUMERO DE TELEPHONE :");
      gets(pc->numTel);
      }while(strlen(pc->numTel)!=10);
      do{
      puts("MAIL : ");
      gets(pc->mel);
      correct=verifMel(pc->mel);
      }while(correct!=1);
       do{
      puts("Voulez vous crypter l'acces a ces donnees? O : pour oui, N pour non");
      scanf("%c", &choix);
      }while((choix!='O')&&(choix!='o') && (choix!='N') && (choix!='n'));
      if((choix=='O') || (choix=='o'))
      {
                  do{
                  puts("Veuillez entrer un mot de passe compris entre 4 et 20 caracteres");
                  memoireTampon();
                  gets(pc->motdepasse);
                  }while((strlen(pc->motdepasse)<4) || (strlen(pc->motdepasse)>20));
      }
      else
      {
          strcpy(pc->motdepasse," ");
      }
      printf("Les donnees concernant %s %s ont ete enregistrees\n", pc->nom ,pc->prenom);
      fin->next=pc; //next recoit pointe vers l'adresse de pc
      getch();
      pc->next=NULL;
      fin=pc;
      nbContact++;
}
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
elle enregistre tout sauf le nom ? C'est étonnant, car le nom est traité comme le prénom.
0
didy_gwatinik Messages postés 358 Statut Membre 80
 
Oui justement c'est ce qui m'étonne ça écrit soit une ligne sans rien ou X> alors que j'entre juste TOTO. Tu ne vois pas quel serait le problème?
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
ça resemble à un problème d'allocation mémoire. N'ayant pas la structure sous les yeux, difficile de dire plus.
En particulier sur "mot de passe".
0
didy_gwatinik Messages postés 358 Statut Membre 80
 
Si je t'envoie mon code complet en message privé, tu pourrais y jeter un coup d'œil?
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299 > didy_gwatinik Messages postés 358 Statut Membre
 
non.
Met le ici, à la rigueur, je ne suis pas certain de le regarder, mais peut être d'autre le ferons. Je ne sais pas si le code entier est nécessaire, mais au moins la structure et l'allocation mémoire.
0
didy_gwatinik Messages postés 358 Statut Membre 80 > Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention  
 
Le gros problème c'est qu'un camarade a trouvé mon code sur ce même forum et l'a recopié , j'ai eu -4 car on avait le même code. Voilà quelques éléments :
void creationFiche()
{
    int correct=0; char choix;
    system("cls");
    puts("==>CREATION FICHE<==\n");
    if (nbContact==0)
    {
    saisieDebut();
      start->next=NULL; //il n'y a rien derrière donc le pointeur est NULL
      fin=start;  
      nbContact++;
      }
      else
      {
            pc=(struct contact *)malloc(sizeof(struct contact)); 
         //On rajoute de la place sur la structure
         saisie();
      
      }
}


void saisie()
{
     char choix;int correct=0;
    // pc=(struct contact *)malloc(sizeof(struct contact)); 
         //On rajoute de la place sur la structure
      memoireTampon();
      puts("NOM : ");
      gets(pc->nom);
      puts("PRENOM : ");
      gets(pc->prenom);
      do{
      puts("NUMERO DE TELEPHONE :");
      gets(pc->numTel);
      }while(strlen(pc->numTel)!=10);
      do{
      puts("MAIL : ");
      gets(pc->mel);
      correct=verifMel(pc->mel);
      }while(correct!=1);
       do{
      puts("Voulez vous crypter l'acces a ces donnees? O : pour oui, N pour non");
      scanf("%c", &choix);
      }while((choix!='O')&&(choix!='o') && (choix!='N') && (choix!='n'));
      if((choix=='O') || (choix=='o'))
      {
                  do{
                  puts("Veuillez entrer un mot de passe compris entre 4 et 20 caracteres");
                  memoireTampon();
                  gets(pc->motdepasse);
                  }while((strlen(pc->motdepasse)<4) || (strlen(pc->motdepasse)>20));
      }
      else
      {
          strcpy(pc->motdepasse," ");
      }
      printf("Les donnees concernant %s %s ont ete enregistrees\n", pc->nom ,pc->prenom);
      fin->next=pc; //next recoit pointe vers l'adresse de pc
      getch();
      pc->next=NULL;
      fin=pc;
      nbContact++;
}


void enregistrement()
{
     FILE *fichier = NULL;//initialisation du pointeur sur fichier
     int i=0;
     fichier=fopen(chemin,"w"); //w pour ecraser l'ancien enregistrement et pour creer un nouveau fichier s'il n'existe pas
     if (fichier != NULL)
     {
                 fprintf(fichier,"%d",nbContact);
                 fprintf(fichier,"\n");
                 pc=start;
                 do{
                          fin=pc->next;
                          fprintf(fichier,pc->nom);
                          fprintf(fichier,"\n");
                          fprintf(fichier,pc->prenom);
                          fprintf(fichier,"\n");
                          fprintf(fichier,pc->numTel);
                          fprintf(fichier,"\n");
                          fprintf(fichier,pc->mel);
                          fprintf(fichier,"\n");
                          fprintf(fichier,pc->motdepasse);
                          fprintf(fichier,"\n");
                          pc=pc->next;
                 }while(fin!=NULL);
    
     fclose(fichier);
     } 
}




void saisieDebut()
{
     int correct;
     char choix;
     start=(struct contact *)malloc(sizeof(struct contact)); 
      //-> pour atteindre les variables quand on est sur un pointeur
      memoireTampon();
      puts("NOM : ");
      gets(start->nom);
      puts("PRENOM : ");
      gets(start->prenom);
      do{
      puts("NUMERO DE TELEPHONE : ");
      gets(start->numTel);
      }while(strlen(start->numTel)!=10 );//&& (isdigit(start->numTel)!=0));

      do{
      puts("MAIL : ");
      gets(start->mel);
      correct=verifMel(start->mel);
      }while(correct!=1);
      do{
      puts("Voulez vous crypter l'acces a ces donnees? O : pour oui, N pour non");
      scanf("%c", &choix);
      }while((choix!='O')&&(choix!='o') && (choix!='N') && (choix!='n'));
      if((choix=='O') || (choix=='o'))
      {
                  do{
                  puts("Veuillez entrer un mot de passe compris entre 4 et 20 caracteres");
                  memoireTampon();
                   gets(start->motdepasse);
                  }while((strlen(start->motdepasse)<4) || (strlen(start->motdepasse)>20));
      }
      else
      {
          strcpy(start->motdepasse," ");
      }
      printf("Les donnees concernant %s %s ont ete enregistrees\n", start->nom ,start->prenom);
      system("pause");
}
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Je comprend ton problème de copie, mais l'aide qu'on apporte ici est pour tous, pas seulement pour toi...
Soit dit en passant, ton "camarade" mérite un bon poing dans la gueule.
le nom merde que lors de l'écriture sur le fichier ou dans les autres controles aussi ?
0
didy_gwatinik Messages postés 358 Statut Membre 80
 
Seulement sur l'écriture dans le fichier
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
essai un printf(pc->nom) juste avant d'écrire sur le fichier. Et si c'est bon, alors essai fprintf(fichier,"%s",pc->nom);
C'est peut être plus propre.
essai avec plusieurs fiches (3 ou 4) voir si le problème surviens à toutes, ou seulement à la première.
quel est le type de nbContact ?
Tu utilise bien des "char[const int]" pour tes chaines de caractère dans ta structure ?
0
didy_gwatinik Messages postés 358 Statut Membre 80
 
Quand je fais un printf(pc->nom); il y a effectivement un problème, ça me mets des caractères bizares : les mêmes que dans le fichier d'ailleurs et c'est la même chose à chaque fois qu'on enregistre un nom. nbContact est déclaré en int.
Voilà la déclaration de ma liste chainée :
struct contact
      {
             char nom[20];
             char prenom[20];
             char numTel[11];
             char mel[50];
             char motdepasse[21];
             struct contact *next; //pointe sur l'adresse du suivant
      }*pc,*start,*fin; //pointeur de type contact : pointeur courant, pointeur pour le début et pour la fin
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Je ne voi pas d'où peut venir le problème...
vérifie peut être que la taille est bien calculer sizeof(contact)==123
tu ne fait pas *pc=... ou *fin=... à un endroit du code ? ou même un pc=string ?
On a vraiment l'impression que tu écris dans l'en-tête de ta structure.
Autre essai, ajoute un "char tampon[16];" au tout début de ta structure, juste avant "nom", et voi si le problème persiste.
Si il persiste, c'est que tu modifie le champ nom quelque part.
0
didy_gwatinik Messages postés 358 Statut Membre 80
 
Ouiiiiiiiiiiiii j'ai essayé le "char tampon[16];" ça marche au poil mais est ce que tu pourrais me l'expliquer, quelle est sa "fonction" ça change quoi en fait?
0
Char Snipeur Messages postés 10112 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
Cette solution n'es est pas une.
Pour comprendre le rôle de tampon, il faut d'abord comprendre ce qu'est une structure.
Une structure est en fait comme un tableau, mais d'élément de différentes taille, qui occupent donc (en gros) des espaces mémoires succesif, c'est à dire que pc[0]==pc->nom[0], pc[21]=pc->prenom[0] etc.
Dans ton cas, c'est en fait une longue chaine de caractère avec des alias de nom (plus un pointeur de structure en bout).
Tampon[16] crée donc un décalage, une zone de mémoire avant nom. Il est maintenant évident qu'un moment de ton programme tu va écrire dans pc->nom, par un chemin détourner. Qu'il faut maintenant que tu trouve.
0