Partage
  • Partager sur Facebook
  • Partager sur Twitter

les fonctions et fichier

aide(projet)

Sujet résolu
    3 janvier 2009 à 22:28:51

    bonsoire
    svp j'ai un tp a rendre l'objectif de ce tp est :
    la creation de deux fonctions.
    _la premiere fonction (rempli):elle ouvre un fichier puis demande les informations de l'etudiant(code,nom,prenom,date de naissance,note) puis elle calcule la moyenne puis elle ferme le fichier
    :) au niveau de la fonction rempli y a pas de probleme.
    _la deusieme fonction(affiche) : elle ouvre le meme fichier fermé en haut puis affiche son contenue( a ce stade j'ai le probleme) :(

    et finalement je manipule les deux fonction a l'aide d'un menu.

    voila le code et merci

    #include<stdio.h>
    #include<conio.h>
    #include<string.h>
    #define x 100
    
    /*declaration de ma structure*/
    struct etudiant{
           int cod;
           char nom[20];
           char prnom[20];
           float note[x];
           float moy;
           char ment[20];
           struct date{
                  int j;
                  int m;
                  int a;
                  }d1;
           };
           
    /*la creation d'un type struct identique a ma structure pour que je puisse le utiluser dans 
    ma fonction rempli()*/
    typedef struct etudiant mas; 
    
    void rempli(char nom_fichier[],mas *mesetu,int nb_etud)
    {
          float note,som;
          int c,ji,mi,ai,i,k,nmat,vs;
          char no[20],pr[20];
          FILE *fichier;
          
         /*Overture du fechier*/
          fichier=fopen(nom_fichier,"w");
          
          /*test de l'overture*/
          if(!fichier)
          {
                      printf("Impossible d'ovrir ce fichier");
                      }
                      
          /*Lecture des donnees d'enregistrement*/
    printf("\nDonner SVP le nombre NOTES : ");
    scanf("%d",&nmat);
    
    /*je boucle pour remplir les champ de ma structure*/
    
    for(i=0;i<nb_etud;i++)
    {
    printf("\n\t Remplissage de fiche_%d",i+1);
    printf("\n\nDonner le code  : ");
    scanf ("%d",&c);
    printf("\nDonner le nom  : ");
    scanf("%s",no);
    printf("\nDonner le prenom  : ");
    scanf("%s",pr);
    printf("\nDonner le jour de naissaince :");
    scanf("%d",&ji);
    printf("\nDonner le mois de naissaince : ");
    scanf("%d",&mi);
    printf("\nDonner la annee de naissaince : ");
    scanf("%d",&ai);
    /* la demande du NOTES et calcul du MOYENNE*/
    som=0;
    for(k=0;k<nmat;k++)
    {
    printf("\nEntre la note %d : ",k+1);
    scanf("%f",&note);
    (*mesetu).note[k]=note;
    som+=(*mesetu).note[k];
    }
    (*mesetu).moy=som/nmat;
    vs=(int)(*mesetu).moy;/*la coversion en type int pour faire un switch*/
     
    /*determination de la mention*/
    switch(vs)
          {
                 case 10:
                 case 11:                           
                 strcpy((*mesetu).ment,"PASSABLE");
                 break;
                 case 12:
                 case 13:     
                  strcpy((*mesetu).ment,"A.BIEN");
                 break;
                 case 14:
                 case 15:     
                 strcpy((*mesetu).ment,"BIEN");
                 break;
                 case 16:
                 case 17:
                 case 18:
                 case 19:
                 case 20:               
                 strcpy((*mesetu).ment,"T.BIEN");
                 break;
                 default :
                 strcpy((*mesetu).ment,"REFUSER");
                 break;
                 }            
    strcpy((*mesetu).nom,no);
    strcpy((*mesetu).prnom,pr);
    (*mesetu).d1.j=ji;
    (*mesetu).d1.m=mi;
    (*mesetu).d1.a=ai;
    (*mesetu).cod=c;
    
    /* lecriture sur le fichier*/
    fprintf(fichier,"%d\t %s\t %s\t %.2f\t %s \t %d-%d-%d\n",(*mesetu).cod,(*mesetu).nom,(*mesetu).prnom,(*mesetu).moy,(*mesetu).ment,(*mesetu).d1.j,(*mesetu).d1.m,(*mesetu).d1.a);
    
    /*Fermeture du fichier*/
    }
    fclose(fichier);
    }
    
    /* la fonction qui affiche mon fichier*/
    
    void afiche(char nom_fichier[],mas *e1,int nb_etud)
    {
         int i=0;
    /* j'ai utiliser le passage par adresse car ma fonction affiche le contenue des champ de mastruc*/
        
        FILE *fichier=NULL;
        
    /*Overture du fechier*/
          fichier=fopen(nom_fichier,"r");
          
          /*test de l'overture*/
          if(!fichier)
          {
                      printf("Impossible d'ovrir ce fichier");
                      }
          /*Affichage rt ICI j'ai le probleme*/
          
    printf("\n code\t nom\t prenom\t moyenne\t mention\t La date_naissance\n");
    fscanf(fichier,"%d%s%s%.2f%s%d%d%d",&(*e1).cod,(*e1).nom,(*e1).prnom,&(*e1).moy,(*e1).ment,&(*e1).d1.j,&(*e1).d1.m,&(*e1).d1.a);
    while (!feof(fichier)&& i< nb_etud)
    {
    fscanf(fichier,"%d%s%s%.2f%s%d%d%d",&(*e1).cod,(*e1).nom,(*e1).prnom,&(*e1).moy,(*e1).ment,&(*e1).d1.j,&(*e1).d1.m,&(*e1).d1.a);
    printf("%d\t %s\t %s\t %.2f\t\t %s \t\t %d-%d-%d\n",(*e1).cod,(*e1).nom,(*e1).prnom,(*e1).moy,(*e1).ment,(*e1).d1.j,(*e1).d1.m,(*e1).d1.a);
    i++;
    }                         
    
    fclose(fichier);
    }
    // le program PRINCIPAL
    main()
    {  
          mas ma;
          char nom_fichier[]="D:\\fnot_etud.txt";
          int nb_etud,menu;
          printf("Donner le nombre d'ETUDIANTS : ");
          scanf("%d",&nb_etud);
         men: printf("\n\n===================MENU===================\n\n");
          printf("\t 1- pour saisire\n\t 2- pour afficher le resultat\n\n");
          printf("Taper votre choix : ");
          scanf("%d",&menu);
          switch(menu)
          {  
                       
          case 1:                                                            
          rempli(nom_fichier,&ma,nb_etud);
          goto men;
          
          case 2:
          afiche(nom_fichier,&ma,nb_etud);
          break;
          }
          getch();
          return 0;
          }
    

    • Partager sur Facebook
    • Partager sur Twitter
      4 janvier 2009 à 11:36:04

      fprintf(fichier,"%d\t %s\t %s\t %.2f\t %s \t %d-%d-%d\n",(*mesetu).cod,(*mesetu).nom,(*mesetu).prnom,(*mesetu).moy,(*mesetu).ment,(*mesetu).d1.j,(*mesetu).d1.m,(*mesetu).d1.a);
      
      /* ... */
      
      fscanf(fichier,"%d%s%s%.2f%s%d%d%d",&(*e1).cod,(*e1).nom,(*e1).prnom,&(*e1).moy,(*e1).ment,&(*e1).d1.j,&(*e1).d1.m,&(*e1).d1.a);
      


      La chaine formatée n'est pas la même !

      Je ne sais pas ce que tu veux faire de ce programme, mais si tu comptes réellement l'utiliser, tu devrais enlever les fautes d'orthographe ...


      ;)
      • Partager sur Facebook
      • Partager sur Twitter
        4 janvier 2009 à 11:56:24

        Citation : mor02


        voila le code


        "%.2f" n'existe pas avec scanf(). C'est "%f" ou %"lf"

        Je conseille de remplacer (*p).e par p->e, c'est beaucoup plus clair et c'est fait pour ça.

        feof() ne fait pas ce que tu crois :

        http://mapage.noos.fr/emdel/notes.htm#fichiers

        getch() et <conio.h> ne sont pas standards. En principe, tu n'en a pas besoin, sauf si tu utilises un IDE antique comme Dev-C++. Je conseille Code::Blocks.

        L'usage justifié de goto est très rare (surtout en arrière). Ici, ce n'est pas le cas. A supprimer. une boucle do-while fera l'affaire. de plus le comportement sera nettement plus clair (pourquoi quitter si on fait une lecture? Il suffit d'ajouter une ligne 'quitter' dans le menu...).


        ceci fonctionne, mais la présentation n'est pas terrible...
        #include<stdio.h>
        #include<string.h>
        
        #define x 100
        
        /*declaration de ma structure*/
        struct etudiant
        {
           int cod;
           char nom[20];
           char prnom[20];
           float note[x];
           float moy;
           char ment[20];
           struct date
           {
              int j;
              int m;
              int a;
           }
           d1;
        };
        
        /*la creation d'un type struct identique a ma structure pour que je puisse le utiluser dans
        ma fonction rempli()*/
        typedef struct etudiant mas;
        
        void rempli (char nom_fichier[], mas * mesetu, int nb_etud)
        {
           float note, som;
           int c, ji, mi, ai, i, k, nmat, vs;
           char no[20], pr[20];
           FILE *fichier;
        
           /*Overture du fechier */
           fichier = fopen (nom_fichier, "w");
        
           /*test de l'overture */
           if (!fichier)
           {
              printf ("Impossible d'ovrir ce fichier");
           }
        
           /*Lecture des donnees d'enregistrement */
           printf ("\nDonner SVP le nombre NOTES : ");
           scanf ("%d", &nmat);
        
        /*je boucle pour remplir les champ de ma structure*/
        
           for (i = 0; i < nb_etud; i++)
           {
              printf ("\n\t Remplissage de fiche_%d", i + 1);
              printf ("\n\nDonner le code  : ");
              scanf ("%d", &c);
              printf ("\nDonner le nom  : ");
              scanf ("%s", no);
              printf ("\nDonner le prenom  : ");
              scanf ("%s", pr);
              printf ("\nDonner le jour de naissaince :");
              scanf ("%d", &ji);
              printf ("\nDonner le mois de naissaince : ");
              scanf ("%d", &mi);
              printf ("\nDonner la annee de naissaince : ");
              scanf ("%d", &ai);
        /* la demande du NOTES et calcul du MOYENNE*/
              som = 0;
              for (k = 0; k < nmat; k++)
              {
                 printf ("\nEntre la note %d : ", k + 1);
                 scanf ("%f", &note);
                 mesetu->note[k] = note;
                 som += mesetu->note[k];
              }
              mesetu->moy = som / nmat;
              vs = (int) mesetu->moy;   /*la coversion en type int pour faire un switch */
        
        /*determination de la mention*/
              switch (vs)
              {
              case 10:
              case 11:
                 strcpy (mesetu->ment, "PASSABLE");
                 break;
              case 12:
              case 13:
                 strcpy (mesetu->ment, "A.BIEN");
                 break;
              case 14:
              case 15:
                 strcpy (mesetu->ment, "BIEN");
                 break;
              case 16:
              case 17:
              case 18:
              case 19:
              case 20:
                 strcpy (mesetu->ment, "T.BIEN");
                 break;
              default:
                 strcpy (mesetu->ment, "REFUSER");
                 break;
              }
              strcpy (mesetu->nom, no);
              strcpy (mesetu->prnom, pr);
              mesetu->d1.j = ji;
              mesetu->d1.m = mi;
              mesetu->d1.a = ai;
              mesetu->cod = c;
        
        /* lecriture sur le fichier*/
              fprintf (fichier, "%d\t %s\t %s\t %.2f\t %s \t %d-%d-%d\n",
                       mesetu->cod, mesetu->nom, mesetu->prnom, mesetu->moy,
                       mesetu->ment, mesetu->d1.j, mesetu->d1.m, mesetu->d1.a);
        
        /*Fermeture du fichier*/
           }
           fclose (fichier);
        }
        
        /* la fonction qui affiche mon fichier*/
        
        void afiche (char nom_fichier[], mas * e1, int nb_etud)
        {
           int i = 0;
        /* j'ai utiliser le passage par adresse car ma fonction affiche le contenue des champ de mastruc*/
        
           FILE *fichier = NULL;
        
        /*Overture du fechier*/
           fichier = fopen (nom_fichier, "r");
        
           /*test de l'overture */
           if (!fichier)
           {
              printf ("Impossible d'ovrir ce fichier");
           }
           /*Affichage rt ICI j'ai le probleme */
        
           printf
              ("\n code\t nom\t prenom\t moyenne\t mention\t La date_naissance\n");
        
           while (i < nb_etud
                  && fscanf (fichier, "%d%s%s%f%s%d%d%d", &e1->cod, e1->nom,
                             e1->prnom, &e1->moy, e1->ment, &e1->d1.j, &e1->d1.m,
                             &e1->d1.a) == 8)
           {
        
              printf ("%d\t %s\t %s\t %.2f\t\t %s \t\t %d-%d-%d\n", e1->cod,
                      e1->nom, e1->prnom, e1->moy, e1->ment, e1->d1.j,
                      e1->d1.m, e1->d1.a);
              i++;
           }
        
           fclose (fichier);
        }
        
        /* le program PRINCIPAL */
        int main (void)
        {
           int fin = 0;
           mas ma;
           char nom_fichier[] = "fnot_etud.txt";
           int nb_etud, menu;
           printf ("Donner le nombre d'ETUDIANTS : ");
           scanf ("%d", &nb_etud);
           do
           {
              printf ("\n\n===================MENU===================\n\n");
              printf ("\t 1- pour saisire\n" "\t 2- pour afficher le resultat\n\n"
                      "\t 3- pour quitter\n\n");
              printf ("Taper votre choix : ");
              scanf ("%d", &menu);
              switch (menu)
              {
        
              case 1:
                 rempli (nom_fichier, &ma, nb_etud);
                 break;
        
              case 2:
                 afiche (nom_fichier, &ma, nb_etud);
                 break;
              case 3:
                 fin = 1;
                 break;
              }
           }
           while (!fin);
           return 0;
        }
        

        Donner le nombre d'ETUDIANTS : 3
        
        
        ===================MENU===================
        
                 1- pour saisire
                 2- pour afficher le resultat
        
                 3- pour quitter
        
        Taper votre choix : 2
        Impossible d'ovrir ce fichier
         code    nom     prenom  moyenne         mention         La date_naissance
        
        
        ===================MENU===================
        
                 1- pour saisire
                 2- pour afficher le resultat
        
                 3- pour quitter
        
        Taper votre choix : 1
        
        Donner SVP le nombre NOTES : 3
        
                 Remplissage de fiche_1
        
        Donner le code  : 123
        
        Donner le nom  : aaa
        
        Donner le prenom  : zzz
        
        Donner le jour de naissaince :1
        
        Donner le mois de naissaince : 2
        
        Donner la annee de naissaince : 3
        
        Entre la note 1 : 1
        
        Entre la note 2 : 2
        
        Entre la note 3 : 3
        
                 Remplissage de fiche_2
        
        Donner le code  : 456
        
        Donner le nom  : eee
        
        Donner le prenom  : rrr
        
        Donner le jour de naissaince :4
        
        Donner le mois de naissaince : 5
        
        Donner la annee de naissaince : 6
        
        Entre la note 1 : 4
        
        Entre la note 2 : 5
        
        Entre la note 3 : 6
        
                 Remplissage de fiche_3
        
        Donner le code  : 789
        
        Donner le nom  : rrr
        
        Donner le prenom  : ttt
        
        Donner le jour de naissaince :7
        
        Donner le mois de naissaince : 8
        
        Donner la annee de naissaince : 9
        
        Entre la note 1 : 7
        
        Entre la note 2 : 8
        
        Entre la note 3 : 9
        
        
        ===================MENU===================
        
                 1- pour saisire
                 2- pour afficher le resultat
        
                 3- pour quitter
        
        Taper votre choix : 2
        
         code    nom     prenom  moyenne         mention         La date_naissance
        123      aaa     zzz     2.00            REFUSER                 1--2--3
        456      eee     rrr     5.00            REFUSER                 4--5--6
        789      rrr     ttt     8.00            REFUSER                 7--8--9
        
        
        ===================MENU===================
        
                 1- pour saisire
                 2- pour afficher le resultat
        
                 3- pour quitter
        
        Taper votre choix : 3
        
        Process returned 0 (0x0)   execution time : 123.082 s
        Press any key to continue.
        • Partager sur Facebook
        • Partager sur Twitter
        Music only !
          4 janvier 2009 à 13:12:11

          merci beaucoup et vraiment chapeau a toi
          • Partager sur Facebook
          • Partager sur Twitter
            4 janvier 2009 à 13:21:00

            Citation : Antoxx

            fprintf(fichier,"%d\t %s\t %s\t %.2f\t %s \t %d-%d-%d\n",(*mesetu).cod,(*mesetu).nom,(*mesetu).prnom,(*mesetu).moy,(*mesetu).ment,(*mesetu).d1.j,(*mesetu).d1.m,(*mesetu).d1.a);
            
            /* ... */
            
            fscanf(fichier,"%d%s%s%.2f%s%d%d%d",&(*e1).cod,(*e1).nom,(*e1).prnom,&(*e1).moy,(*e1).ment,&(*e1).d1.j,&(*e1).d1.m,&(*e1).d1.a);
            



            La chaine formatée n'est pas la même !



            Le sujet est résolu alors je squatte : pourquoi le code marche alors que les chaines de format ne sont pas les mêmes ? Je croyais qu'il fallait exactement la même syntaxe pour que ça marche ...

            edit :

            Citation : man scanf

            Les blancs (comme les espaces, les tabulations ou les retours chariots) dans la chaîne format correspondent à un nombre quelconque de blancs (et même aucun) dans la chaine d'entrée. Tous les autres caractères ne peuvent correspondre qu'a eux-même. L'examen de l'entrée s'arrête dès qu'un caractère d'entrée ne correspond pas à un caractère du format. L'examen s'arrête également quand une conversion d'entrée est impossible (voir ci-dessous).



            Donc avec ou sans espace ça marche pareil ...
            Désolé pour ma mauvaise réponse !

            ;)
            • Partager sur Facebook
            • Partager sur Twitter

            les fonctions et fichier

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown