|
Dernière réponse | |
---|---|
Sujet : urgent SVP prog d un annuaire en C | |
gee | ok :) |
Aperçu |
---|
Vue Rapide de la discussion |
---|
gee | ok :) |
Kristoph | 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. |
R3g | 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. |
gee | 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 .. :) |
Kristoph | 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. |
gee | svp snif |
gee | 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] |