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 -
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...
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:
- Liste chainées et fichier
- Liste déroulante excel - Guide
- Fichier bin - Guide
- Fichier epub - Guide
- Fichier rar - Guide
- Comment réduire la taille d'un fichier - Guide
7 réponses
?
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.
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.
ç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".
En particulier sur "mot de passe".
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");
}
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 ?
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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
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 ?
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 ?
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 :
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
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.
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.
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.
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.
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++; }