并非如此 上述方便在 一次输入for(){ } 在括号内逐条写入(输入一个结构体信息 写一个结构体)
下图 输入数组后 一起写入也可 fwrite(&stu[i],sizeof(struct student),1,fp);
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<stdlib.h>
struct student{
char name[100];
int no;
int grade;
}stu;
int cmp(const void *a,const void *b)
{
if((((*(struct student*)a).grade-(*(struct student*)b).grade))==0)
return strcmp((*(struct student *)a).name,(*(struct student *)b).name);
return (*(struct student*)a).grade-(*(struct student*)b).grade;
}
int main(int argc, char const *argv[])
{
FILE *fp;
if((fp=fopen("/Users/hellooks/Desktop/Code/2020.txt","w+"))==NULL)
{
printf("fail\n");
exit(0);
}
char str[100];
int x=1;
while(x!=0)
{
gets(str);
strcpy(stu.name,str);
gets(str);
stu.no=atoi(str);
gets(str);
stu.grade=atoi(str);
fwrite(&stu,sizeof(stu),1,fp);
printf("继续输入 x!=0\n");
scanf("%d",&x);
getchar();
printf("xiayige\n");
}
printf("chulail\n");
fseek(fp,0,SEEK_SET);
struct student st[100];
int i=0;
while(fread(&stu,sizeof(stu),1,fp)==1)
{
printf("chulail\n");
// printf("%s %d %d\n",stu.name,stu.no,stu.grade);
strcpy(st[i].name,stu.name);
st[i].no=stu.no;
st[i].grade=stu.grade;
i++;
}
for(int j=0;j<i;j++)
printf("%s %d %d\n",st[j].name,st[j].no,st[j].grade);
qsort(st,i,sizeof(st[0]),cmp);
fseek(fp,0,SEEK_SET);
for(int j=0;j<i;j++)
{
stu.no=st[j].no;//关键key!!!
stu.grade=st[j].grade;
strcpy(stu.name,st[j].name);
printf("%s %d %d %s %d %d\n",st[j].name,st[j].no,st[j].grade,stu.name,stu.no,stu.grade);
fwrite(&stu,sizeof(stu),1,fp);
}
fseek(fp,0,SEEK_SET);
while(fread(&stu,sizeof(stu),1,fp)==1)
{
printf("%s %d %d\n",stu.name,stu.no,stu.grade);
}
return 0;
}