>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define etudian_num 400
struct etudiant{
    char nom[10];
    float moy;
};
void SaisirEtudiant(struct etudiant E,FILE *ficheierEtudiant) {
    ficheierEtudiant = fopen("C:/Users/Ayoub/Desktop/TDTP/Ex1/Etudiant.dat","wb");
    char rep;
    do {
        fseek(ficheierEtudiant, 0, SEEK_END);
        printf("Saisir nom etudiant a saisir: ");
        scanf("%s",&E.nom);
        printf("Saisir son Moyen: ");
        scanf("%f",&E.moy);
        fwrite (&E, sizeof(struct etudiant), 1,ficheierEtudiant);
        if(fwrite!=0) {
            printf("\n\nEtudaint Ajouter avec succees !\n\n");
        }
        printf("Voulez Vouz Saisir un autre Etudiant (O,N): ");
        scanf(" %c",&rep);
    } while(toupper(rep)!='N');
    fclose(ficheierEtudiant);    
}
void AjoutEtudian(struct etudiant E,FILE *ficheierEtudiant) {    
    ficheierEtudiant=fopen("C:/Users/Ayoub/Desktop/TDTP/Ex1/Etudiant.dat","ab+");
    printf("Saisir Nom de Nouveau Etudiant: ");
    scanf("%s",&E.nom);
    printf("Saisir Son Moyen: ");
    scanf("%f",&E.moy);
    fwrite (&E, sizeof(struct etudiant), 1,ficheierEtudiant);
    printf("Saisir de nouveau Etudiant avec Success ! ");
    fclose(ficheierEtudiant);
}
void EcrireListeEtudiant(struct etudiant E, FILE* fichierEtudiant) {
    fichierEtudiant=fopen("C:/Users/Ayoub/Desktop/TDTP/Ex1/Etudiant.dat","r+");
    while(fread(&E,sizeof(struct etudiant),1,fichierEtudiant)){
    printf("Nom Etudiant: %s| Moyen= %.2f \n", E.nom, E.moy);}
    fclose(fichierEtudiant);
}
void ModifierEtudiant(struct etudiant E,FILE* fichierEtudiant) {
    fichierEtudiant=fopen("C:/Users/Ayoub/Desktop/TDTP/Ex1/Etudiant.dat","rb+");
    char RechercheEtudiant[10];
    float NouveauMoyen;
    printf("Saisir Le nom de letudiant a modifier son Moyen: ");
    scanf("%s",&RechercheEtudiant);
    float Moyenancianen=0.0;
    while(fread(&E,sizeof(struct etudiant),1,fichierEtudiant)) {
        if(strcmp(E.nom,RechercheEtudiant)==0) {
            Moyenancianen=E.moy;
            printf("Saisir Nouveau Moyen pour ",E.nom);
            scanf("%f",&NouveauMoyen);
            E.moy=NouveauMoyen;
            printf("\n\nMoyen Ancien = %.2f , Nouveau Moyen = %.2f\n\n",Moyenancianen,NouveauMoyen);
        }else {
            printf("Nom invalid !");
        }    
    }
    fclose(fichierEtudiant);    
}
void Menu() {
    printf("Press: \n");
    printf("\t\n1-Pour Ajouter un Nouveau List des Etudiant\n");
    printf("\t\n2-pour imprimer Liste des Etudiant \n");
    printf("\t\n3-pour Ajouter un Nouveau Etudiant \n");
    printf("\t\n4-pour Modifier Moyen d un Etudain\n");
    printf("\t\n5-pour imprimer Liste de Menu\n");
    printf("\t\n6-Pour Quitter \n");
} 
int main()
{ printf("\t\t***************************Programme de Gestion des Etudiants***************************\n\n\n\n");
   FILE *fichierEtudiant;
    struct etudiant E;
    int choice;
    int num;
    int quit=0;
    Menu();
    while(quit==0){
        printf("\nSaisir Votre Choix: ");
        scanf("%d",&choice);
        switch(choice){
        case 1:
            SaisirEtudiant(E,fichierEtudiant);
            break;
        case 2:
            EcrireListeEtudiant(E,fichierEtudiant);
            break;
        case 3:
            AjoutEtudian(E,fichierEtudiant);
            break;
        case 4:
            ModifierEtudiant(E,fichierEtudiant);
            break;
        case 5:
            Menu();
            break;
        case 6:
            quit =1;
            printf("A bientot.....");
            break;
        }
    }   
}

이 프로그램은 학생들의 목록과 마크를 저장하려고합니다. 수정 부분 (ModifierEtudiant 메서드)까지 모든 것이 잘 작동합니다. 사용자로부터 이름을 읽으므로 나중에 이진 파일에 존재하는지 확인할 수 있습니다. 그것이 발견되면, 사용자는 새로운 마크를 입력하도록 요구하고 새로운 마크 값을 취하지 않는 것 같습니다.


  • 답변 # 1

    포인터를 제어해야합니다! fseek (피치에 티튜 이터,-(long) sizeof (E), 1); fwrite (&E, sizeof (E), 1, fichierEtudiant);

  • 이전 Guava StandardTable put 메소드가 널값을 거부하는 이유
  • 다음 postgresql - 장고 마이그레이션 - 데이터베이스 사용 후 모델 필드 수정