Liste chainées et fichier
Fermé
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
-
27 oct. 2008 à 14:14
Char Snipeur Messages postés 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 - 28 oct. 2008 à 17:29
Char Snipeur Messages postés 9688 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 2 octobre 2020 - 28 oct. 2008 à 17:29
A voir également:
- Liste chainées et fichier
- Liste déroulante excel - Guide
- Fichier rar - Guide
- Fichier host - Guide
- Fichier iso - Guide
- Le fichier contient une liste de prénoms. triez ce tableau par ordre alphabétique des prénoms. quel mot est formé par les 6 premières lettres de la colonne code ? - Forum Bureautique
7 réponses
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
27 oct. 2008 à 14:49
27 oct. 2008 à 14:49
?
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.
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
27 oct. 2008 à 16:43
27 oct. 2008 à 16:43
elle enregistre tout sauf le nom ? C'est étonnant, car le nom est traité comme le prénom.
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
27 oct. 2008 à 16:45
27 oct. 2008 à 16:45
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?
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
27 oct. 2008 à 16:53
27 oct. 2008 à 16:53
ç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".
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
27 oct. 2008 à 16:55
27 oct. 2008 à 16:55
Si je t'envoie mon code complet en message privé, tu pourrais y jeter un coup d'œil?
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
>
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
27 oct. 2008 à 16:59
27 oct. 2008 à 16:59
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.
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.
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
>
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
27 oct. 2008 à 17:06
27 oct. 2008 à 17:06
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");
}
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
28 oct. 2008 à 08:43
28 oct. 2008 à 08:43
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 ?
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
28 oct. 2008 à 09:38
28 oct. 2008 à 09:38
Seulement sur l'écriture dans le fichier
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
28 oct. 2008 à 09:47
28 oct. 2008 à 09:47
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 ?
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
28 oct. 2008 à 09:55
28 oct. 2008 à 09:55
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
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
28 oct. 2008 à 15:01
28 oct. 2008 à 15:01
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.
didy_gwatinik
Messages postés
352
Date d'inscription
samedi 17 novembre 2007
Statut
Membre
Dernière intervention
30 mars 2010
80
28 oct. 2008 à 15:09
28 oct. 2008 à 15:09
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?
Char Snipeur
Messages postés
9688
Date d'inscription
vendredi 23 avril 2004
Statut
Contributeur
Dernière intervention
2 octobre 2020
1 329
28 oct. 2008 à 17:29
28 oct. 2008 à 17:29
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.
27 oct. 2008 à 16:05
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++; }