Aide pour un exercice en C

Fermé
Nassim - Modifié le 6 janv. 2023 à 15:20
 Noa - 24 déc. 2022 à 19:29

Bonjour les amis,

Je ne sais pas ou est le problème (Langage C), je vous prie de m'aider.

Merci d'avance.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
    void ajouter(FILE *F1){
        char c[30];
        float ndi,nf,nc,nd,nex;
        printf("Numero d'inscription : ");
        scanf("%f",&ndi);
        fprintf(F1,"%f",ndi);
        printf("Nom complet : ");
        fflush(stdin);
        gets(c);
        fputs(c,F1);
        printf("note du devoir : ");
        scanf("%f",&nd);
        fprintf(F1,"%f",nd);
        printf("note du controle : ");
        scanf("%f",&nc);
        fprintf(F1,"%f",nc);
        printf("note d'examen final: ");
        scanf("%f",&nex);
        fprintf(F1,"%f",nex);
        printf("note finale : ");
        scanf("%f",&nf);
        fprintf(F1,"%f",nf);
        
    }
    
    
    void afficher(FILE *F1){
        rewind(F1);
        char c[30];
        float ndi,nf,nc,nd,nex;
        while(fscanf(F1,"%f%s%f%f%f%f",&ndi,c,&nd,&nc,&nex,&nf)!=EOF){
            
            printf("Numero d'inscription : %.0f\nNom complet : %s\nNote du devoir : %.2f\nNote du controle : %.2f\nNote d'examen final : %.2f\nNote finale : %.2f\n",ndi,c,nd,nc,nex,nf);
        }    
            printf("                    ***********************************************************************");
    }
    
    
    void majorant(FILE *F1){
        float ndi,nf,nc,nd,nex;
        float maj=0;
        char c[30],d[30];
        rewind(F1);
        while(fscanf(F1,"%f%s%f%f%f%f",&ndi,c,&nd,&nc,&nex,&nf)!=EOF){
            if(maj<nf){
                maj=nf;
                strcpy(d,c);
            }    
        }
        
        printf("Le majorant est : ");
        puts(d);
    }
    
    
    void modifiernom(FILE *F1){
        rewind(F1);
        float ndi,nf,nc,nd,nex;
        float ndins;
        char d[30], c[30];
        printf("Donner le numero d'inscription : ");
        scanf("%f",&ndins);
        while(fscanf(F1,"%f%s%f%f%f%f",&ndi,c,&nd,&nc,&nex,&nf)!=EOF){
            if(ndins==ndi){
                printf("Donner le noveau nom complet : ");
                fflush(stdin);
                gets(d);
                strcpy(c,d);
            }
            else printf("Ce numero d'inscription n'existe pas .");    
        }
        
        
    }
    
    
    void rechercher(FILE *F1){
        char c[30];
        float ndi,nf,nc,nd,nex;
        float ndins;
        rewind(F1);
        printf("Donner le numero d'inscription : ");
        scanf("%f",&ndins);
        while(fscanf(F1,"%f%s%f%f%f%f",&ndi,c,&nd,&nc,&nex,&nf)!=EOF){
            if(ndins==ndi){
            printf("Numero d'inscription : %.0f\nNom complet : %s\nNote du devoir : %.2f\nNote du controle : %.2f\nNote d'examen final : %.2f\nNote finale : %.2f\n",ndi,c,nd,nc,nex,nf);
                    
                }
        
        
    }
    
    
    
    
    
int main(int argc, char *argv[]) {
    FILE *F1;
    int a;
    F1=fopen("eleves.txt","a+");
    do{
        printf("Pour ajouter un etudiant entrez 1, pour afficher tous les etudiants entrez 2, pour rechercher le majorant de la classe entrez 3, pour modifier le nom d'un etudiant apartir du numero d'inscription entrez 4 et pour rechercher et afficher les enregistrements d'un etudiant apartir du numero d'inscription entrez 5 : ");
    scanf("%d",&a);
    switch (a){
    case 1 : ajouter(F1);break;
    case 2 : afficher(F1);break;
    case 3 : majorant(F1);break;
    case 4 : modifiernom(F1);break;
    case 5 : rechercher(F1);break;
    default : return 0;
        }    
    }while(a>0&&a<6);
    return 0;
}

2 réponses

Pourrais-tu décrire ton problème. On ne va pas analyser tout ton code.
Je peux juste dire que flush sur stdin peut conduire à un comportement indéterminé.
Utilises fgets au lieu de gets pour éviter des problèmes de débordement.

Veux-tu tout écrire sur une ligne? Tu ne mets pas d'espace entre les champs avec fprintf.

Et fputs va générer une fin de ligne. C'est ce que tu veux?

0

Bonsoir, il y a plusieurs erreurs dans ton code. Tout d'abord, tu utilises la fonction gets qui est dépréciée et doit être évitée. Tu devrais plutôt utiliser fgets ou scanf pour lire des chaînes de caractères.

Ensuite, tu n'ouvres pas le fichier en mode écriture avant d'essayer de l'écrire dans la fonction ajouter. Pour ouvrir un fichier en mode écriture, tu dois utiliser la fonction fopen de cette manière:

FILE *F1 = fopen("nom_du_fichier.txt", "w");

Tu devrais également vérifier si la fonction fopen a réussi à ouvrir le fichier avant d'essayer de l'écrire. Si elle renvoie NULL, cela signifie que l'ouverture du fichier a échoué et tu devrais afficher une erreur ou quitter le programme.

Enfin, dans la fonction modifiernom, tu dois fermer le fichier après avoir fini de lire et écrire dedans, en utilisant la fonction fclose.

Je te suggère également de structurer ton code de manière à le rendre plus lisible et plus facile à comprendre, en utilisant par exemple des commentaires pour expliquer ce que font chaque fonction et chaque boucle.

Je te suggère également de mettre en place une gestion des erreurs pour ton code, en vérifiant par exemple les valeurs de retour des fonctions que tu utilises et en affichant un message d'erreur approprié en cas d'échec.

0