Partage
  • Partager sur Facebook
  • Partager sur Twitter

Gestion d'étudiants en utilisant les fichiers

24 décembre 2015 à 1:00:27

Bonsoir tout le monde.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>

struct Etudiant
{
    int mat;
    char nom[41];
    char prenom[41];
    int niv;
    float moy;
    char dec;
};

int main()
{
    void trquit(char*);
    void quit(char*);
    void creation(void);
    void lecture(void);
    void ajout(void);
    void recherche(int);
    void modif(int);
    void suppr(void);
    int c;
    char rep;
    do
    {
        system("cls");
        printf("Que voulez-vous faire?\n\n1- Creer une nouvelle liste d'etudiants.(Attention! Cela supprimera les donnees precedement enregistree)\n2- Afficher la liste d'etudiants.\n3- Ajouter un nouvel etudiant.\n4- Afficher les donnees d'un etudiant.\n5- Modifier un etudiant.\n6- Supprimer un etudiant.\n7- Quitter.\n\n");
        scanf("%d",&c);
        Restart:
            switch(c)
            {
            case 1:
                system("cls");
                creation();
                quit(&rep);
                break;
            case 2:
                system("cls");
                lecture();
                quit(&rep);
                break;
            case 3:
                system("cls");
                ajout();
                quit(&rep);
                break;
            case 4:
                system("cls");
                printf("Entrer la matricule de l'etudiant recherche: ");
                scanf("%d",&c);
                recherche(c);
                quit(&rep);
                break;
            case 5:
                system("cls");
                printf("Entrer la matricule de l'etudiant dont vous voulez modifier les donnees: ");
                scanf("%d",&c);
                modif(c);
                quit(&rep);
                break;
            case 6:
                system("cls");
                suppr();
                quit(&rep);
                break;
            case 7:
                return 0;
            default:
                printf("Vous avez entrer une valeur inexistante dans le menu. Veuillez reessayer: ");
                scanf("%d",&c);
                goto Restart;
            }
    }while(rep=='o' || rep=='O');
    return 0;
}

void trquit(char *rep)
{
    Start:
        fflush(stdin);
        *rep=getchar();
        if(*rep!='n' && *rep!='N' && *rep!='o' && *rep!='O')
        {
            printf("Vous avez entre un caractere different de O et N. Veuillez reessayer: ");
            goto Start;
        }
}

void quit(char *rep)
{
    printf("\n\nVoulez-vous effectuer une nouvelle operation? (O/N): ");
    trquit(rep);
}

void creation(void)
{
    FILE *F;
    struct Etudiant Etud;
    char rep;
    F=fopen("Etudiant.dat","wb");
    if(F==NULL)
    {
        printf("Creation de la liste impossible.");
        getch();
        exit(-1);
    }
    do
    {
        printf("\n\tMatricule: ");
        scanf("%d",&Etud.mat);
        printf("\tNom: ");
        fflush(stdin);
        gets(Etud.nom);
        printf("\tPrenom: ");
        fflush(stdin);
        gets(Etud.prenom);
        printf("\tNiveau: ");
        scanf("%d",&Etud.niv);
        printf("\tMoyenne: ");
        scanf("%f",&Etud.moy);
        printf("\tDecision: ");
        fflush(stdin);
        Etud.dec=getchar();
        fwrite(&Etud,sizeof(Etud),1,F);
        printf("Voulez-vous ajouter un nouvel etudiant? (O/N): ");
        trquit(&rep);
    }while(rep=='o' || rep=='O');
    fclose(F);
}

void lecture(void)
 {
     FILE *F;
     struct Etudiant Etud;
     int i=0;
     F=fopen("Etudiant.dat","rb");
     if(F=NULL)
     {
         printf("Ouverture impossible du fichier de donnees.");
         getch();
     }
     else
     {
         while(fread(&Etud,sizeof(Etud),1,F))
         {
             i++;
             printf("Etudiant %d:\n\tMarticule: %d\n\tNom: %s\n\tPrenom: %s\n\tNiveau: %d\n\tMoyenne: %f\n\tDecision: %c.\n\n",i,Etud.mat,Etud.nom,Etud.prenom,Etud.niv,Etud.moy,Etud.dec);
         }
         fclose(F);
     }
 }

 void ajout(void)
 {
     FILE *F;
     struct Etudiant Etud;
     F=fopen("Etudiant.dat","ab");
     if(F==NULL)
     {
         printf("Ouverture impossible du fichier de donnees.");
         getch();
     }
     else
     {
         printf("\n\tMatricule: ");
         scanf("%d",&Etud.mat);
         printf("\tNom: ");
         fflush(stdin);
         gets(Etud.nom);
         printf("\tPrenom: ");
         fflush(stdin);
         gets(Etud.prenom);
         printf("\tNiveau: ");
         scanf("%d",&Etud.niv);
         printf("\tMoyenne: ");
         scanf("%f",&Etud.moy);
         printf("\tDecision: ");
         fflush(stdin);
         Etud.dec=getchar();
         fwrite(&Etud,sizeof(Etud),1,F);
         fclose(F);
     }
 }

 void recherche(int c)
 {
     FILE *F;
     struct Etudiant Etud;
     int trouve=0;
     F=open("Etudiant.dat","rb");
     if(F==NULL)
     {
         printf("Ouverture impossible du fichier de donnees.");
         getch();
     }
     else
     {
         while(!trouve && feof(F))
         {
             fread(&Etud,sizeof(Etud),1,F);
             if(Etud.mat==c) trouve=1;
         }
         if(trouve==0) printf("Etudiant non trouve.");
         else printf("Etudiant recherche:\n\tMarticule: %d\n\tNom: %s\n\tPrenom: %s\n\tNiveau: %d\n\tMoyenne: %f\n\tDecision: %c.\n\n",Etud.mat,Etud.nom,Etud.prenom,Etud.niv,Etud.moy,Etud.dec);
         fclose(F);
     }
 }

 void modif(int c)
 {
     FILE *F;
     struct Etudiant Etud;
     int trouve=0;
     long pos;
     char rep;
     F=fopen("Etudiant.dat","rb+");
     if(F==NULL)
     {
         printf("Ouverture impossible du fichier de donees.");
         getch();
     }
     else
     {
         while(!trouve && feof(F))
         {
             pos=ftell(F);
             fread(&Etud,sizeof(Etud),1,F);
             if(Etud.mat==c) trouve=1;
         }
         if(trouve==0) printf("Etudiant non trouve.");
         else
         {
             printf("Donnees actuelles de l'etudiant:\n\tMarticule: %d\n\tNom: %s\n\tPrenom: %s\n\tNiveau: %d\n\tMoyenne: %f\n\tDecision: %c.\n\n",Etud.mat,Etud.nom,Etud.prenom,Etud.niv,Etud.moy,Etud.dec);
             printf("Modifier la matricule? (O/N): ");
             fflush(stdin);
             rep=getchar();
             if(rep=='o' || rep=='O')
             {
                 printf("\tMatricule: ");
                 scanf("%d",&Etud.mat);
             }
             printf("Modifier le nom? (O/N): ");
             fflush(stdin);
             rep=getchar();
             if(rep=='o' || rep=='O')
             {
                 printf("\tNom: ");
                 fflush(stdin);
                 gets(Etud.nom);
             }
             printf("Modifier le prenom? (O/N): ");
             fflush(stdin);
             rep=getchar();
             if(rep=='o' || rep=='O')
             {
                 printf("\tPrenom: ");
                 fflush(stdin);
                 gets(Etud.prenom);
             }
             printf("Modifier le niveau? (O/N): ");
             fflush(stdin);
             rep=getchar();
             if(rep=='o' || rep=='O')
             {
                 printf("\tNiveau: ");
                 scanf("%d",&Etud.niv);
             }
             printf("Modifier la moyenne? (O/N): ");
             fflush(stdin);
             rep=getchar();
             if(rep=='o' || rep=='O')
             {
                 printf("\tMoyenne: ");
                 scanf("%f",&Etud.moy);
             }
             printf("Modifier la decision? (O/N): ");
             fflush(stdin);
             rep=getchar();
             if(rep=='o' || rep=='O')
             {
                 printf("\tDecision: ");
                 fflush(stdin);
                 Etud.dec=getchar();
             }
             fseek(F,pos,SEEK_SET);
             fwrite(&Etud,sizeof(Etud),1,F);
             fclose(F);
         }
     }
 }

void suppr(void)
{
    FILE *F,*Ftemp;
    struct Etudiant Etud;
    char nomEt[41], prenomEt[41];
    int i=0;
    F=fopen("Etudiant.dat","rb");
    Ftemp=fopen("temp.dat","wb+");
    if(F==NULL)
    {
        printf("Ouverture du fichier de donnees impossible.");
        getch();
    }
    else if(Ftemp==NULL)
    {
        printf("Creation du fichier temporaire impossible.");
        getch();
    }
    else
    {
        printf("Nom de l'etudiant: ");
        fflush(stdin);
        gets(nomEt);
        printf("Prenom de l'etudiant: ");
        fflush(stdin);
        gets(prenomEt);
        while(fread(&Etud,sizeof(Etud),1,F)) if(strcmp(Etud.nom,nomEt) && strcmp(Etud.prenom,prenomEt)) fwrite(&Etud,sizeof(Etud),1,Ftemp);
        fclose(F);
        fclose(Ftemp);
        remove("Etudiant.dat");
        rename("temp.dat","Etudiant.dat");
    }
}

Ci-dessus le code du programme qui permet de gérer (créer, ajouter, afficher, modifier, supprimer...) les données d'étudiants (matricule, nom, prenom...) (c'est long oui :/ Désolé je n'ai pas encore appris à découper le fichier de code). J'explique le principe: la fonction main joue le role d'un menu, qui nous affiche des choix, nous permet de choisis puis fait appel à la fonction qui correspond à ce choix. En plus de ces fonctions, on trouve trquit et quit qui permettent de vérifier si l'utilisateur souhaire continuer ou refaire une action ou pas.

Le code ci-dessous se compile et le menu fonction bien. La création du fichier de données (avec saisie des données) semble bien fonctionner (on a bien un fichier qui apparait au disque dur et en l'ouvrant avec .txt on trouve les données écrite en langue extraterrestre. C'est lorsqu'on souhaite rechercher ou modifier un étudiant que le programme beug ou plante (n'affiche rien lorsqu'on choisit l'affichage ou alors l’exécutable est planté comme c'est le cas pour afficher les données d'un etudiant).

J'ai révisé le code mais je n'ai pas pu résoudre ces beugs. Pouvez-vous m'aider? Merci d'avance!

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
24 décembre 2015 à 4:30:36

Salut, à la place de system, utilises plutôt les fonctions de la famille exec.

Quand tu affiches une erreur, redirige les sur stderr et pas sur stdout.

La fonction fflush à un comportement indéterminée sur stdin, fait la toi même :

void flush_input_buffer(void)
{
    int   car;

    while((car = getchar())!= '\n' && car != EOF);
}

Après pour debbug ton code tu peux soit te servir de assert() ou alors de perror() à l'aide de la variable errno.

Oublies pas d'inclure errno.h :)

Exemple avec une ouverture de fichier qui foire : 

FILE* f = NULL;

f = fopen("fichier_qui_existe_pas.txt", "r+");

if(!f)
{
     perror("fopen");
     exit(EXIT_FAILURE);
}

N'utilises pas gets() mais plutôt fgets sur le flux stdin.


-
Edité par Anonyme 24 décembre 2015 à 4:41:55

  • Partager sur Facebook
  • Partager sur Twitter
24 décembre 2015 à 14:54:03

Merci beaucoup pour votre réponse.

J'ai apprécié les conseils que vous m'avez donné.

J'ai aussi trouvé ces erreurs fatales:

-Ligne 194: fopen au lieu de open.

-Lignes 202 et 228: !feof(F) au lieu de feof(F).

-Ligne 322: || au lieu de &&.

  • Partager sur Facebook
  • Partager sur Twitter
14 décembre 2018 à 10:35:56

c'est bien fait

-
Edité par WilliamMinani 14 décembre 2018 à 14:15:37

  • Partager sur Facebook
  • Partager sur Twitter
14 décembre 2018 à 11:27:16

Salut,

Pour ça, tu peux créer un nouveau post au lieu de faire un déterrage, et éventuellement poser la question sur le forum C++.

Bonne continuation.

  • Partager sur Facebook
  • Partager sur Twitter

Bonhomme !! | Jeu de plateforme : Prototype.