urgent SVP prog d un annuaire en C - Programmation
Marsh Posté le 08-02-2002 à 23:39:35
svp snif
Marsh Posté le 09-02-2002 à 01:10:12
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.
Marsh Posté le 09-02-2002 à 01:37:57
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 ..
Marsh Posté le 09-02-2002 à 15:53:52
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.
Marsh Posté le 09-02-2002 à 17:13:15
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.
Marsh Posté le 09-02-2002 à 18:08:53
ok
Marsh Posté le 08-02-2002 à 23:09:09
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]
---------------
"Phildar t'es vraiment une pute pas finie toi! Et Manu le gros porc arrete de t'marrer!"