Gestion personnel avec liste chainé

Fermé
PAPILEX Messages postés 4 Date d'inscription mardi 29 mai 2018 Statut Membre Dernière intervention 30 mai 2018 - Modifié le 30 mai 2018 à 10:06
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 - 30 mai 2018 à 14:09
bonjour ou bonsoir.
jai un mini projet gestion personel en c avec une liste chainé que je doit sauvegardé dans un fichier jai fini les fonction nécéssaire et la liste saffiche normalement mais le problem cest lecriture dans le fichier jy arrive pas merci davance pour votre aide....
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>
typedef struct date {
 int j;
 int m;
 int a;
 }date;
typedef struct personne
{
 char prenom[20];
 char nom[20];
 char sexe;
 date d;
 int nbrenfant;
 char identifiant[5];
 personne *suiv ;
 personne *precd;
}personne;
typedef personne *liste;


FILE *ps;
struct date saisidate(){
 struct date d;
 do{
  printf("donnez l'annee \n ");
  scanf("%d",&d.a);
  
 }while(d.a<1915||d.a>2018);
 do{
  printf(" donnez le mois ");
  scanf("%d",&d.m);
 }while(d.m<0||d.m>12);
 switch(d.m){
  case 1:
   case 3:
    
     case 5:
      case 7:
       case 8:
        case 10 :
         case 12:
          do{
           printf(" donner le jours \n");
           scanf("%d",&d.j);
           }while(d.j<0||d.j>31);
           break;
           case 4:
            case 6:
             case 9:
              case 11:
               do{
                printf("donnez le jour \n ");
                scanf("%d",&d.j);
               }while(d.j<0||d.j>30);
               break;
           
           
           case 2:
            if((d.a%4==0)&&(d.a%100==0)){
             do{
                printf("donner le jour:");
                scanf("%d",&d.j);
               }while(d.j<=0||d.j>29);break;
               
              }else
              {
               do{
                printf("donner le jour:");
                scanf("%d",&d.j);
               }while(d.j<=0||d.j>28);break;
              }
             
            }
            return(d);
            
            
            }
personne*alloue(){
 personne*pers=(personne*)malloc(sizeof(personne));
 pers->suiv=NULL;
 return(pers);
}
void ajoutez(liste tete,personne*p)
{
 if(tete==NULL)
 {
  tete=p;
 }
 else
 {
  p->suiv=tete;
  tete=p;
 }
}
liste charge(FILE*ps)
{
 liste l=NULL;
 personne *p;
 
 ps=fopen("ps.txt","a");
 if (ps==NULL)
 {
  printf("le fichier es vide\n");
 }
 while(!feof(ps))
 {
    p=alloue();
    fscanf(ps,"%s,%s,%c,%d,%d,%,%d,%s",p->prenom,p->nom,p->sexe,&p->d.j,&p->d.m,&p->d.a,p->nbrenfant,p->identifiant);
    ajoutez(l,p);
     
 }
 fclose(ps);
 return l;
}
liste ajouter(liste l)
{
 personne *p=alloue();
  printf("donner le prenom:");
   scanf("%s",p->prenom);
   printf("donner le nom:");
   scanf("%s",p->nom);
   printf("donner le sexe");
   scanf("%s",&p->sexe);
   printf("donner le nombre denfant:");
   scanf("%d",&p->nbrenfant);
   printf("donner lidentifiant:");
   scanf("%s",p->identifiant);
   printf("\n");
   p->d=saisidate();
   ajoutez(l,p);
}
 void afficher(personne *p){
  printf("\n le nom %s \n prenom %s \n sexe  %c \n date naissance %d %d %d \n nombre d enfant %d \n identifiant%s \n  ",p->nom,p->prenom,p->sexe,p->d.j,p->d.m,p->d.a,p->nbrenfant,p->identifiant);
 }
 void afficherliste(liste l){
  liste p;
  p=l;
  if(p==NULL){
   printf(" la liste es vide \n ");
  }
  while(p!=NULL){
   afficher(p);
   p=p->suiv;
  }
 }
bool recherche(liste l ,personne *precd ,personne *p ,char nom[20]){
 precd=NULL;
 p=l;
 if(p==NULL){
  printf(" la liste vide \n ");
 }
 while((p!=NULL)&&(strcmp(nom,p->nom)!=0))
 {
  precd=p;
  p=p->suiv;
 }
 if(strcmp(nom,p->nom)==0){return(true);
 }else return false;
 }

void modifier_nbrdenfant(liste l, char prenom[20]){

    personne*p,*precd;
     if(recherche(l,precd,p,prenom)==true){
      printf(" donnez le nouveax nombre d enfant");
      scanf("%d",&p->nbrenfant);
  }
  
  }
  int affichez_nbrenfant(liste l,char prenom[20])
  {
   personne *p,*precd;
   
   if(recherche(l,precd,p,prenom)==true)
   {
    return(p->nbrenfant);
   }
   else
   {
    printf("cette personne nexist pas");
   }
  }
liste supprimer(liste l,char prenom[20]){
 personne *p,*precd;
 if( recherche(l,precd,p,prenom)==true){
  if(precd==NULL){
   l=l->suiv;
   free(p);
   printf("supprimer avec succe\n ");
   return(l);
  }else{
   precd->suiv=p->suiv;
   free(p);
  }
 }else{
  printf("cette perssone nexiste pas");
 }
}
char prenom(liste l ,char prenom[20]){
  personne *p,*precd;
 if( recherche(l,precd,p,prenom)==true){return(p->nom[20]);}}
 
 int age(liste l,char prenom[20],int n)
{
 personne *p,*precd;
 
 if(recherche(l,precd,p,prenom)==true)
 {
  return(n-p->d.a);
 }
 else
 {
  printf("cette personne nexist pas");
 }
}
/*void ercirefichier(liste l,FILE*F)
{
 personne *p;
 FILE *ps=fopen("ps.txt ","w+");
 
 if(feof(ps)){
  printf("erreur ");}
  p=l;
  while(p!=NULL){
   fprintf(ps,"%s,%s,%c,%s,%d,%d,%d,%d,%s",p->prenom,p->nom,p->sexe,p->d.j,p->d.m,p->d.a,p->nbrenfant,p->identifiant);
   p=p->suiv;
   
  }
  fclose(ps);
  
}*/
void erciredansfichier(personne *p)
{
 FILE *ps;
 ps=fopen("ps.txt","w");
 if(ps!=NULL)
 {
  personne *suiv=NULL;
  personne *precd=NULL;
  while(p!=NULL)
  {
   fseek(ps,0,SEEK_END);
   fwrite(p,sizeof(personne),1,ps);
   
   printf("writing:%s to file\n",p->nom);
  p=p->suiv;
  
  }
  
  suiv=NULL;
  precd=NULL;
  
 }
 else
 {
  printf("erreur lors de louverture du fichier");
 }
}



void quitter()

{

    exit(0);

}

int main()
{

FILE* ps;
 personne p,*precd;
 liste l;
 
 int i,n;
 

  l=ajouter(l);
  
 afficherliste(l);
 erciredansfichier(l);
 return(0);
}
A voir également:

4 réponses

[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 29 mai 2018 à 10:48
Bonjour PAPILEX,

Ton programme ne compile pas (sur des choses qui n'ont rien à voir avec un problème d'écriture) et gcc se plaint d'erreurs et de warnings multiples.

$ gcc -Wall 35387979.c
35387979.c:21:2: error: unknown type name ‘personne’
personne *suiv ;
^
35387979.c:22:2: error: unknown type name ‘personne’
personne *precd;
^
35387979.c: In function ‘ajoutez’:
35387979.c:97:10: warning: assignment from incompatible pointer type
p->suiv=tete;
^
35387979.c: In function ‘charge’:
35387979.c:114:3: warning: format ‘%c’ expects argument of type ‘char *’, but argument 5 has type ‘int’ [-Wformat=]
fscanf(ps,"%s,%s,%c,%d,%d,%,%d,%s",p->prenom,p->nom,p->sexe,&p->d.j,&p->d.m,&p->d.a,p->nbrenfant,p->identifiant);
^
35387979.c:114:3: warning: unknown conversion type character ‘,’ in format [-Wformat=]
35387979.c:114:3: warning: format ‘%s’ expects argument of type ‘char *’, but argument 9 has type ‘int’ [-Wformat=]
35387979.c:114:3: warning: too many arguments for format [-Wformat-extra-args]
35387979.c: In function ‘afficherliste’:
35387979.c:149:4: warning: assignment from incompatible pointer type
p=p->suiv;
^
35387979.c: At top level:
35387979.c:152:1: error: unknown type name ‘bool’
bool recherche(liste l ,personne *precd ,personne *p ,char nom[20]){
^
35387979.c: In function ‘recherche’:
35387979.c:161:4: warning: assignment from incompatible pointer type
p=p->suiv;
^
35387979.c:163:35: error: ‘true’ undeclared (first use in this function)
if(strcmp(nom,p->nom)==0){return(true);
^
35387979.c:163:35: note: each undeclared identifier is reported only once for each function it appears in
35387979.c:164:15: error: ‘false’ undeclared (first use in this function)
}else return false;
^
35387979.c: In function ‘modifier_nbrdenfant’:
35387979.c:170:34: error: ‘true’ undeclared (first use in this function)
if(recherche(l,precd,p,prenom)==true){
^
35387979.c: In function ‘affichez_nbrenfant’:
35387979.c:180:34: error: ‘true’ undeclared (first use in this function)
if(recherche(l,precd,p,prenom)==true)
^
35387979.c: In function ‘supprimer’:
35387979.c:191:35: error: ‘true’ undeclared (first use in this function)
if( recherche(l,precd,p,prenom)==true){
^
35387979.c:193:5: warning: assignment from incompatible pointer type
l=l->suiv;
^
35387979.c: In function ‘prenom’:
35387979.c:207:35: error: ‘true’ undeclared (first use in this function)
if( recherche(l,precd,p,prenom)==true){return(p->nom[20]);}}
^
35387979.c: In function ‘age’:
35387979.c:213:34: error: ‘true’ undeclared (first use in this function)
if(recherche(l,precd,p,prenom)==true)
^
35387979.c: In function ‘erciredansfichier’:
35387979.c:252:5: warning: assignment from incompatible pointer type
p=p->suiv;
^
35387979.c:245:13: warning: variable ‘precd’ set but not used [-Wunused-but-set-variable]
personne *precd=NULL;
^
35387979.c:244:13: warning: variable ‘suiv’ set but not used [-Wunused-but-set-variable]
personne *suiv=NULL;
^
35387979.c: In function ‘main’:
35387979.c:283:8: warning: unused variable ‘n’ [-Wunused-variable]
int i,n;
^
35387979.c:283:6: warning: unused variable ‘i’ [-Wunused-variable]
int i,n;
^
35387979.c:280:14: warning: unused variable ‘precd’ [-Wunused-variable]
personne p,*precd;
^
35387979.c:280:11: warning: unused variable ‘p’ [-Wunused-variable]
personne p,*precd;
^
35387979.c:279:8: warning: unused variable ‘ps’ [-Wunused-variable]
FILE* ps;
^
35387979.c: In function ‘ajouter’:
35387979.c:137:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
35387979.c: In function ‘recherche’:
35387979.c:165:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
35387979.c: In function ‘affichez_nbrenfant’:
35387979.c:188:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
35387979.c: In function ‘supprimer’:
35387979.c:204:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^
35387979.c: In function ‘prenom’:
35387979.c:207:2: warning: control reaches end of non-void function [-Wreturn-type]
if( recherche(l,precd,p,prenom)==true){return(p->nom[20]);}}
^
35387979.c: In function ‘age’:
35387979.c:221:1: warning: control reaches end of non-void function [-Wreturn-type]
}
^

Tu devrais commencer par corriger ton code pour qu'il compile proprement sans erreurs ni warnings, et on y verra plus clair.

Lorsque tu postes ton code sur le forum, utilise les balises <code c> permettant de préserver l'indentation de ton code, de colorer la syntaxe et numéroter tes lignes. Si tu n'as pas vu le bouton de l'éditeur te permettant de poster ton code correctement, il est là :


S'agissant de l'écriture de tes données, tu dois décider si tu les stockes sous forme de texte sérialisant le contenu (cela sera plus portable) ou sous forme binaire (la sauvegarde ne pourra être lue que sur un type d'architecture compatible).

fopen("ps.txt","w");
utilise le spécificateur "w" et donc ouvre le fichier en écriture pour du texte ("wb" serait pour du binaire). Or, plus bas, tu utilises
fwrite(p,sizeof(personne),1,ps);
, qui prétend vouloir écrire la struct. C'est incohérent :-)

http://www.cplusplus.com/reference/cstdio/fopen/
http://www.cplusplus.com/reference/cstdio/fwrite/

fseek parait inutile, car tu crées un fichier de zéro (ou tu écrases son contenu s'il existe), et c'est une mauvaise idée de le mettre dans la boucle, car fwrite fera de toutes façons avancer l'indicateur de position d'écriture.

Aussi, je ne comprends pas ce que tu fais avec
personne *suiv=NULL;
et
personne *precd=NULL;
que tu déclares avant ta boucle while.

Il faudrait un fclose aussi :

http://www.cplusplus.com/reference/cstdio/fclose/

Dal
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 29 mai 2018 à 18:26
Si je devais hasarder une hypothèse, je pense que si ton code compile de ton côté, c'est que tu dois utiliser un compilateur C++ (g++ ?) et non un compilateur C (et si tu utilises un EDI, tu as dû indiquer un type de projet C++ au lieu de C)... (et qu'il n'empêche que tu as quand même dû avoir la floppée de warnings que donnerait aussi une compilation en C).

C et C++ sont deux langages différents.

En C, tu dois faire une déclaration avancée de ton typedef sur une struct avant de pouvoir y faire référence au sein de la struct.

Par exemple :

typedef struct Node Node;
struct Node {
     int value;
     Node *next;
     Node *prev;
};

En C, également, le type ‘bool’ (et true et false) ne sera accessible qu'en C99 et nécessite d'inclure stdbool.h pour qu'il soit compris par le compilateur C. Avec un compilateur C supportant C99, il suffit d'inclure cet entête pour supprimer cette autre erreur de compilation.

Ce sont les deux erreurs qui se manifestent avec un compilateur C.

Les autres messages du compilateur sont des warnings.

Pour les messages d'erreur ou avertissements de ton compilateur, commence toujours par corriger le premier qui se manifeste, corrige le, recompile, corrige le premier qui se manifeste, etc., jusqu'à compilation sans erreurs ni warnings.

Si tu ne comprends pas certains des messages, poste ton code corrigé, et le message que tu ne comprends pas, et on t'aidera dans la mesure du possible.

Les warnings signalent dans 90% des cas des comportements anormaux ou dangereux et, en fait, des bogues. Il faut que tu comprennes la raison pour laquelle ils se manifestent, et que tu rectifies le code avec cette compréhension.

Dal
0
PAPILEX Messages postés 4 Date d'inscription mardi 29 mai 2018 Statut Membre Dernière intervention 30 mai 2018
Modifié le 30 mai 2018 à 10:08
cc dal merci de maider!!
oui en effet le programme compile sans erreur de mon coté(jutilise le devc++)
voila le programme jai essayer avec le bouton pour la balise que ta donner mais sa marche pas"code c code"....avec lajout de ta rectification donné sur les "bool"et une petite modification de la fonction qui ecrit dans le fichier,les données sont stockés en mode texte pour ce cas.
merci de ton aide je doit le rendre avant le 31 de ce mois...
#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <ctype.h>

typedef struct Node Node;
struct Node {
     int value;
     Node *next;
     Node *prev;
};
typedef struct date {
 int j;
 int m;
 int a;
 }date;
typedef struct personne
{
 char prenom[20];
 char nom[20];
 char sexe;
 date d;
 int nbrenfant;
 char identifiant[5];
 personne *suiv ;
 personne *precd;
}personne;
typedef personne *liste;


FILE *ps;
struct date saisidate(){
 struct date d;
 do{
  printf("donnez l'annee \n ");
  scanf("%d",&d.a);
  
 }while(d.a<1915||d.a>2018);
 do{
  printf(" donnez le mois ");
  scanf("%d",&d.m);
 }while(d.m<0||d.m>12);
 switch(d.m){
  case 1:
   case 3:
    
     case 5:
      case 7:
       case 8:
        case 10 :
         case 12:
          do{
           printf(" donner le jours \n");
           scanf("%d",&d.j);
           }while(d.j<0||d.j>31);
           break;
           case 4:
            case 6:
             case 9:
              case 11:
               do{
                printf("donnez le jour \n ");
                scanf("%d",&d.j);
               }while(d.j<0||d.j>30);
               break;
           
           
           case 2:
            if((d.a%4==0)&&(d.a%100==0)){
             do{
                printf("donner le jour:");
                scanf("%d",&d.j);
               }while(d.j<=0||d.j>29);break;
               
              }else
              {
               do{
                printf("donner le jour:");
                scanf("%d",&d.j);
               }while(d.j<=0||d.j>28);break;
              }
             
            }
            return(d);
            
            
            }
personne*alloue(){
 personne*pers=(personne*)malloc(sizeof(personne));
 pers->suiv=NULL;
 return(pers);
}
void ajoutez(liste tete,personne*p)
{
 if(tete==NULL)
 {
  tete=p;
 }
 else
 {
  p->suiv=tete;
  tete=p;
 }
}
liste charge(FILE*ps)
{
 liste l=NULL;
 personne *p;
 
 ps=fopen("ps.txt","a");
 if (ps==NULL)
 {
  printf("le fichier es vide\n");
 }
 while(!feof(ps))
 {
    p=alloue();
    fscanf(ps,"%s,%s,%c,%d,%d,%,%d,%s",p->prenom,p->nom,p->sexe,&p->d.j,&p->d.m,&p->d.a,p->nbrenfant,p->identifiant);
    ajoutez(l,p);
     
 }
 fclose(ps);
 return l;
}
liste ajouter(liste l)
{
 personne *p=alloue();
  printf("donner le prenom:");
   scanf("%s",p->prenom);
   printf("donner le nom:");
   scanf("%s",p->nom);
   printf("donner le sexe");
   scanf("%s",&p->sexe);
   printf("donner le nombre denfant:");
   scanf("%d",&p->nbrenfant);
   printf("donner lidentifiant:");
   scanf("%s",p->identifiant);
   printf("\n");
   p->d=saisidate();
   ajoutez(l,p);
}
 void afficher(personne *p){
  printf("\n le nom %s \n prenom %s \n sexe  %c \n date naissance %d %d %d \n nombre d enfant %d \n identifiant%s \n  ",p->nom,p->prenom,p->sexe,p->d.j,p->d.m,p->d.a,p->nbrenfant,p->identifiant);
 }
 void afficherliste(liste l){
  liste p;
  p=l;
  if(p==NULL){
   printf(" la liste es vide \n ");
  }
  while(p!=NULL){
   afficher(p);
   p=p->suiv;
  }
 }
bool recherche(liste l ,personne *precd ,personne *p ,char nom[20]){
 precd=NULL;
 p=l;
 if(p==NULL){
  printf(" la liste vide \n ");
 }
 while((p!=NULL)&&(strcmp(nom,p->nom)!=0))
 {
  precd=p;
  p=p->suiv;
 }
 if(strcmp(nom,p->nom)==0){return(true);
 }else return false;
 }

void modifier_nbrdenfant(liste l, char prenom[20]){

    personne*p,*precd;
     if(recherche(l,precd,p,prenom)==true){
      printf(" donnez le nouveax nombre d enfant");
      scanf("%d",&p->nbrenfant);
  }
  
  }
  int affichez_nbrenfant(liste l,char prenom[20])
  {
   personne *p,*precd;
   
   if(recherche(l,precd,p,prenom)==true)
   {
    return(p->nbrenfant);
   }
   else
   {
    printf("cette personne nexist pas");
   }
  }
liste supprimer(liste l,char prenom[20]){
 personne *p,*precd;
 if( recherche(l,precd,p,prenom)==true){
  if(precd==NULL){
   l=l->suiv;
   free(p);
   printf("supprimer avec succe\n ");
   return(l);
  }else{
   precd->suiv=p->suiv;
   free(p);
  }
 }else{
  printf("cette perssone nexiste pas");
 }
}
char prenom(liste l ,char prenom[20]){
  personne *p,*precd;
 if( recherche(l,precd,p,prenom)==true){return(p->nom[20]);}}
 
 int age(liste l,char prenom[20],int n)
{
 personne *p,*precd;
 
 if(recherche(l,precd,p,prenom)==true)
 {
  return(n-p->d.a);
 }
 else
 {
  printf("cette personne nexist pas");
 }
}
void erciredansfichier(liste l,FILE*F)
{
 personne *p;
 FILE *ps=fopen("ps.txt ","w+");
 
 if(feof(ps)){
  printf("erreur ");}
  p=l;
  while(p!=NULL){
   fprintf(ps,"%s,%s,%c,%s,%d,%d,%d,%d,%s",p->prenom,p->nom,p->sexe,p->d.j,p->d.m,p->d.a,p->nbrenfant,p->identifiant);
   p=p->suiv;
   
  }
  fclose(ps);
  
}




void quitter()

{

    exit(0);

}

int main()
{

FILE* ps;
 personne p,*precd;
 liste l;
 
 int i,n;
 

  l=ajouter(l);
  
 afficherliste(l);
 erciredansfichier(l,ps);
 return(0);
}
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 30 mai 2018 à 10:16
Au sujet de ta fonction d'écriture, puise que c'est ta question initiale :

"w+" est pour ouvrir un fichier texte en lecture/écriture. Là tu veux juste écrire un fichier texte, donc "w" suffit, comme indiqué précédemment.

Je ne comprends pas pourquoi tu passes FILE*F en paramètre, alors que tu ne t'en sers pas et que tu déclares FILE *ps dans ta fonction.

Tu ne dois pas faire
if (feof(ps))
(qui teste si on est arrivé en fin de fichier) puisque tu ne lis pas le fichier, tu veux écrire des données sur un nouveau fichier où, par définition, il n'y a rien.

Il y a des erreurs dans tes spécificateurs d'écriture qui ne sont pas cohérents avec les types de données.

D'autre part, si tu vas écrire une ligne par enregistrement de personne, tu devrais terminer la ligne avec
\n


tu t'y retrouves mieux visuellement si tu présentes ton code comme cela :

void ecriredansfichier(liste l) {
    FILE *ps;
    personne *p;

    ps = fopen("ps.txt","w");
    if (ps != NULL) {
        p = l;
        while (p != NULL) {
            /* écriture nom, prénom, sexe, */
            fprintf(ps, "%s,%s,%c,", p->prenom, p->nom, p->sexe);
            /* écriture date, */
            fprintf(ps, "%d,%d,%d,", p->d.j, p->d.m, p->d.a);
            /* écriture enfants, identifiant et fin de ligne */
            fprintf(ps, "%d,%s\n", p->nbrenfant, p->identifiant);
            printf("writing: %s to file\n", p->nom);
            p = p->suiv;
        }
        fclose(ps); 
    } else {
        printf("erreur lors de l'ouverture du fichier");
    }
}


J'ai aussi corrigé la typo sur le nom de la fonction "erciredansfichier" au lieu de "ecriredansfichier".

A condition que ton code produise une liste correctement faite et non vide, et que tu passes à la fonction l'adresse de la tête de liste, cette fonction devrait stocker les données de la liste dans un fichier texte, avec une personne par ligne, et les données séparées par des virgules. La fonction de lecture doit parser correctement le format correspondant de la ligne, le mieux étant de lire d'abord toute la ligne avec fgets, puis de traiter son contenu avec strtok agissant sur les caractères séparateurs, en contrôlant la validité des données récupérées. Note que si le texte sauvegardé (par exemple dans le nom) comporte des virgules, tu ne pourras pas les distinguer des séparateurs. Pour le format CSV, il est d'usage de mettre les chaînes de caractères entre guillemets, pour être capable de faire cette distinction, mais cela complexifie ta lecture. Une autre stratégie est d'interdire la saisie de virgule et de vérifier que la saisie est valide. Cependant, au vu de ton code, je pense que tu as d'autres chats à fouetter (beaucoup d'autres problèmes à corriger) et que c'est du raffinement.

Si, pour la lecture, au lieu d'utiliser fgets et strok, tu utilises scanf, vois :

https://stackoverflow.com/questions/15091284/read-comma-separated-input-with-scanf

Je n'ai pas regardé le reste de ton programme, mais tu n'as manifestement pas suivi mes conseils sur la correction de warnings ou des erreurs de compilation en C.

Si tu dois faire ton programme en C, j'attire de nouveau ton attention sur le fait qu'il ne compile pas avec un compilateur C. C'est un peu dommage de te tromper de langage en testant ton programme avec un compilateur C++ et de livrer un code qui ne compile pas en C. Dev-C++ est un EDI qui s'appuie sur le portage MinGW des compilateurs C (gcc) et C++ (g++) de la Free Software Foundation. Tu peux donc parfaitement faire du C avec. Refait un projet C et non pas un projet C++, et copie colle ton code dans le main pour le compiler et le déboguer correctement.

Quant aux warnings, le compilateur t'aide en donnant des indications sur ce qui ne va pas selon lui. Ne les ignore pas.

Toute ceci, je te l'ai déjà dit. Je ne le répéterai plus, tu es un grand garçon maître de ton destin :-)

Tu auras ensuite à corriger d'autres erreurs (de conception, de logique, etc.).

Je vois aussi que tu as intégré la struct Node que je donnais en exemple... il s'agissait d'un exemple de déclaration correcte en C et non pas d'un code à utiliser tel quel.

Ton programme comporte un certain nombre de fonctions effectivement utilisées par ton code et appelées directement ou indirectement par main(), d'autres sont dans le code, mais ne sont jamais appelées dans ce que tu as posté (c'est du "code mort").

Je ne sais pas ce qu'elles font là et si cela est normal : quitter(), age(), supprimer(), affichez_nbrenfant(), modifier_nbrdenfant(), recherche(), charge() dans laquelle de beaux warnings t'avertissent d'incohérences, notamment tu as un spécificateur "%," (qui devrait être "%d,"),... et qui ne chargera certainement pas correctement les données sauvegardées....

Dal
0
PAPILEX Messages postés 4 Date d'inscription mardi 29 mai 2018 Statut Membre Dernière intervention 30 mai 2018
Modifié le 30 mai 2018 à 11:07
rebonjour dal.
encore merci pour tous les conseils...je suis en premiere année info alors je suis plutot nul pour lintant lol...
pour les fonctions ecrites que tu voit dans le main pas je les ai toutes testé elle marche bien jai reduit le main a "afficher" et "ecrire" pour pas vous presentez un livre lol...
tu a carrement raisons je doit changé de compilateur parsque jai jusqua laffichage que je tu verras en screenshots mais toujours rien sur le fichier..... je doit le rendre au plus tard demain alors je changerais de compilateur mais je suis plus sur quil arrivera a bout .jai pri deux semaine pour ecrire ce que tu califi de "code mort" lol..encore merci de ton temps dal...
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 30 mai 2018 à 11:40
L'expression "code mort" était pour signifier qu'il est présent, mais inutile, car non utilisé

S'il est, en fin de compte, utilisé, il n'est pas du code mort, et tu devrais le corriger

S'il n'y a rien dans ton fichier, c'est peut-être (sans doutes) que le problème est ailleurs, et que tu ne passes pas à la fonction l'adresse mémoire de la tête de pile, ou que ta pile est mal formée ou altérée au stade où tu appelles cette fonction

Ton Dev-C++ ne semble pas générer de warnings dans la capture. C'est étrange (le paramètre a peut-être été retiré ou n'est pas coché par défaut). Cela fait longtemps que je n'ai pas utilisé Dev-C++ (ce projet a longtemps été à l'abandon, avant d'être repris par Orwell il y a quelques années).

Codeblocks est un autre EDI gratuit et aujourd'hui plus populaire que Dev-C++ et qui reste facile d'utilisation.

Codeblocks est paramétré par défaut pour gérer les warnings avec l'option -Wall de gcc. Tu peux le récupérer là :

http://www.codeblocks.org/downloads/26

Télécharge la version "codeblocks-17.12mingw-setup.exe" pour avoir le compilateur avec l'EDI (n'utilise pas les autres liens).

Quand tu crées ton projet, choisit bien un projet Console application en C et non pas C++.

Dal
0
PAPILEX Messages postés 4 Date d'inscription mardi 29 mai 2018 Statut Membre Dernière intervention 30 mai 2018
30 mai 2018 à 12:17
slt dal.
je vien dinstallé le compilateur que ta conseillé mais tjrs aucun warnigs....
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 30 mai 2018 à 12:48
Tu travailles encore en C++, je le vois au nom de ton fichier MODIF.cpp et il semble que tu n'aies pas créé de projet Codeblocks, mais juste chargé ce fichier dans Codeblocks. Du coup, il n'y a pas de paramètres particuliers associés au projet et notamment ceux afférents aux warnings (si tu faisais la même chose avec Dev-C++ cela peut aussi expliquer l'absence de warnings).

Ferme tout ce que tu as ouvert dans Codeblocks, puis :

Dans Codeblocks, fais File -New - Project - Console application - Next - C (et pas C++) - met un titre au projet - Next - Finish

dans le main.c créé par Codeblocks, accessible dans l'arborescence du projet sous "Sources" copie-colle ton code, sauvegarde le projet avec File - Save project et compile.

Cela devrait compiler en C et avec les warnings.
0
[Dal] Messages postés 6174 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 2 février 2024 1 083
Modifié le 30 mai 2018 à 14:12
autre morale : à l'avenir, ne nomme pas ton fichier .cpp si tu fais du C :-)
0