C 我正试图在二进制文件中打印记录中的最小标记

C 我正试图在二进制文件中打印记录中的最小标记,c,C,该计划是关于学生的东西,它输出他们的分数,他们的名字等。。。当我通过创建一个浮点数组找到学生的位置,并在数组中找到最小数字的位置,然后尝试使用此位置指向并读取学生的姓名,学生的标记看起来似乎与方法namemoy不起作用。你看得不对。此代码 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <ctype.h> #define etudian_num 400 stru

该计划是关于学生的东西,它输出他们的分数,他们的名字等。。。当我通过创建一个浮点数组找到学生的位置,并在数组中找到最小数字的位置,然后尝试使用此位置指向并读取学生的姓名,学生的标记看起来似乎与方法namemoy不起作用。

你看得不对。此代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define etudian_num 400
struct etudiant{
char nom[10];
float moy;
int matricule;
};

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 Matricule de L etudiant: ");
    scanf("%i",&E.matricule);
    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 Matricule de Nouveau Etudiant: ");
scanf("%i",&E.matricule);
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 AfficheListe(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("\nMatricule: %i | Nom Etudiant: %s| Moyen= %.2f \n",E.matricule,E.nom,E.moy);}
fclose(fichierEtudiant);

}


void ModifierEtudiant(struct etudiant E,FILE* fichierEtudiant){
fichierEtudiant=fopen("C:/Users/Ayoub/Desktop/TDTP/Ex1/Etudiant.dat","rb+");
int MatRecherche;
printf("Saisir Le Matricule de letudiant a modifier son Moyen: ");
scanf("%i",&MatRecherche);
float Moyenancianen=0.0;
float NouveauMoyen;
int p;
while(fread(&E,sizeof(E),1,fichierEtudiant)){

    if(E.matricule==MatRecherche){
    fseek(fichierEtudiant,-(long)sizeof(E),1);
        printf("Saisir Nouveau Moyen pour %s:",E.nom);
        scanf("%f",&NouveauMoyen);
        Moyenancianen=E.moy;
        E.moy=NouveauMoyen;
        fwrite (&E, sizeof(E), 1,fichierEtudiant);
        printf("\n\nMoyen Ancien = %.2f , Nouveau Moyen = %.2f\n\n",Moyenancianen,NouveauMoyen);
        break;
    }
}

fclose(fichierEtudiant);

}

void suprimList(struct etudiant E , FILE* fichierEtudiant){
fichierEtudiant=fopen("C:/Users/Ayoub/Desktop/TDTP/Ex1/Etudiant.dat","w");
printf("Contenu Supprime! ");
fclose(fichierEtudiant);
}

void min_moy(struct etudiant E , FILE* fichierEtudiant){
fichierEtudiant=fopen("C:/Users/Ayoub/Desktop/TDTP/Ex1/Etudiant.dat","rb+");
float min=0.0;
int pos=0;
float T[30];
int LongeurTableau=0;
//Affectation de Moyenne dans un tableau T et Calcul de sa Taille
while(fread(&E,sizeof(struct etudiant),1,fichierEtudiant)){
       T[LongeurTableau]=E.moy;
       LongeurTableau++;
        }
     //Determiner la position de Moyen le Plus Bas
    min=T[0];
   for(int j=0;j<LongeurTableau;j++){
     while(T[j]<min){
        pos=j;
        min=T[j];
     }
   }
   fseek(fichierEtudiant,0,pos);
   fread(&E,sizeof(struct etudiant),1,fichierEtudiant);
   printf("%s a eu la Moyenne Le Plus Bas avec un Moyen = %.2f",E.nom,E.moy);
}



void Menu(){
printf("Press: \n");
printf("\t\n1-Pour Ajouter un Nouveau List des Etudiant\n");
printf("\t\n2-pour Afficher Liste des Etudiant \n");
printf("\t\n3-pour Ajouter un Nouveau Etudiant \n");
printf("\t\n4-pour Modifier Moyen d un EtudainT\n");
printf("\t\n5-pour Afficher Liste de Menu\n");
printf("\t\n6-pour Supprimer La liste\n");
printf("\t\n7-pour Avoir Le minimum Moyenne: \n");
printf("\t\n8-Pour Quitter \n");
}









int main()
{ printf("\t\t***************************Programme de Gestion des Etudiants***************************\n\n\n\n");
   FILE *fichierEtudiant;
    struct etudiant E;
    float NouveauMoyen;
    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:
            AfficheListe(E,fichierEtudiant);
            break;
        case 3:
            AjoutEtudian(E,fichierEtudiant);
            break;

        case 4:

            ModifierEtudiant(E,fichierEtudiant);
            break;
        case 5:
            Menu();
            break;
        case 6:
            suprimList(E,fichierEtudiant);
            break;
        case 7:
            min_moy(E,fichierEtudiant);
            break;
        case 8:
            quit =1;
            printf("\n\nA bientot.....\n\n\n");
            break;
        }
    }



//Souid_Ayoub

}
fseek(fichierEtudiant, pos * sizeof(struct etudiant), SEEK_SET);
不会将文件位置移动到pos记录

功能原型为:

fseek(fichierEtudiant,0,pos);

所以你需要一些类似的东西:

int fseek(FILE *stream, long offset, int whence);
但是,既然您已经读取了所有记录一次,为什么不将它们完全存储在数组中,而不是只存储一个浮点成员。寻找和重读一条记录的效果会非常糟糕

顺便说一句:这个代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define etudian_num 400
struct etudiant{
char nom[10];
float moy;
int matricule;
};

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 Matricule de L etudiant: ");
    scanf("%i",&E.matricule);
    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 Matricule de Nouveau Etudiant: ");
scanf("%i",&E.matricule);
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 AfficheListe(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("\nMatricule: %i | Nom Etudiant: %s| Moyen= %.2f \n",E.matricule,E.nom,E.moy);}
fclose(fichierEtudiant);

}


void ModifierEtudiant(struct etudiant E,FILE* fichierEtudiant){
fichierEtudiant=fopen("C:/Users/Ayoub/Desktop/TDTP/Ex1/Etudiant.dat","rb+");
int MatRecherche;
printf("Saisir Le Matricule de letudiant a modifier son Moyen: ");
scanf("%i",&MatRecherche);
float Moyenancianen=0.0;
float NouveauMoyen;
int p;
while(fread(&E,sizeof(E),1,fichierEtudiant)){

    if(E.matricule==MatRecherche){
    fseek(fichierEtudiant,-(long)sizeof(E),1);
        printf("Saisir Nouveau Moyen pour %s:",E.nom);
        scanf("%f",&NouveauMoyen);
        Moyenancianen=E.moy;
        E.moy=NouveauMoyen;
        fwrite (&E, sizeof(E), 1,fichierEtudiant);
        printf("\n\nMoyen Ancien = %.2f , Nouveau Moyen = %.2f\n\n",Moyenancianen,NouveauMoyen);
        break;
    }
}

fclose(fichierEtudiant);

}

void suprimList(struct etudiant E , FILE* fichierEtudiant){
fichierEtudiant=fopen("C:/Users/Ayoub/Desktop/TDTP/Ex1/Etudiant.dat","w");
printf("Contenu Supprime! ");
fclose(fichierEtudiant);
}

void min_moy(struct etudiant E , FILE* fichierEtudiant){
fichierEtudiant=fopen("C:/Users/Ayoub/Desktop/TDTP/Ex1/Etudiant.dat","rb+");
float min=0.0;
int pos=0;
float T[30];
int LongeurTableau=0;
//Affectation de Moyenne dans un tableau T et Calcul de sa Taille
while(fread(&E,sizeof(struct etudiant),1,fichierEtudiant)){
       T[LongeurTableau]=E.moy;
       LongeurTableau++;
        }
     //Determiner la position de Moyen le Plus Bas
    min=T[0];
   for(int j=0;j<LongeurTableau;j++){
     while(T[j]<min){
        pos=j;
        min=T[j];
     }
   }
   fseek(fichierEtudiant,0,pos);
   fread(&E,sizeof(struct etudiant),1,fichierEtudiant);
   printf("%s a eu la Moyenne Le Plus Bas avec un Moyen = %.2f",E.nom,E.moy);
}



void Menu(){
printf("Press: \n");
printf("\t\n1-Pour Ajouter un Nouveau List des Etudiant\n");
printf("\t\n2-pour Afficher Liste des Etudiant \n");
printf("\t\n3-pour Ajouter un Nouveau Etudiant \n");
printf("\t\n4-pour Modifier Moyen d un EtudainT\n");
printf("\t\n5-pour Afficher Liste de Menu\n");
printf("\t\n6-pour Supprimer La liste\n");
printf("\t\n7-pour Avoir Le minimum Moyenne: \n");
printf("\t\n8-Pour Quitter \n");
}









int main()
{ printf("\t\t***************************Programme de Gestion des Etudiants***************************\n\n\n\n");
   FILE *fichierEtudiant;
    struct etudiant E;
    float NouveauMoyen;
    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:
            AfficheListe(E,fichierEtudiant);
            break;
        case 3:
            AjoutEtudian(E,fichierEtudiant);
            break;

        case 4:

            ModifierEtudiant(E,fichierEtudiant);
            break;
        case 5:
            Menu();
            break;
        case 6:
            suprimList(E,fichierEtudiant);
            break;
        case 7:
            min_moy(E,fichierEtudiant);
            break;
        case 8:
            quit =1;
            printf("\n\nA bientot.....\n\n\n");
            break;
        }
    }



//Souid_Ayoub

}
fseek(fichierEtudiant, pos * sizeof(struct etudiant), SEEK_SET);
看起来很奇怪。可替换为:

 while(T[j]<min){
    pos=j;
    min=T[j];
 }
谢谢你,伙计