//文件中存放了20个由小到大的排列的整数,现在从键盘上输入一个数,要求把该数插入此文件中,保持文件特性不变。
//基本思想是:先从文件中读取那20个数放入字符数组中,然后再对字符数组进行操作
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 5
struct ST{
char name[10];
int num;
int age;
char addr[5];
int s[3];
float ave;
}stu[M],temp,m;
void save()
{
//借助一个中间变量进行实现
int i,j,k,t;
float sum=0;
FILE *fp;
if((fp=fopen("t.dat","wb"))==NULL)
{
printf("error");
exit(0);
}
//实现按学生的平均分的高低进行排序,这里用选择排序来实现吧
for(i=0;i<3-1;i++)
{
k=i;
for(j=i+1;j<3;j++)
if(stu[j].ave>stu[k].ave)
k=j;
//注意这块进行交换的是结构体数组,不是单个比较的数据项
temp=stu[i];
stu[i]=stu[k];
stu[k]=temp;
}
printf("请输入一个学生的信息包括姓名学号年龄和地址\n");
scanf("%s %d %d %s",m.name,&m.num,&m.age,m.addr);
printf("输入这三个学生的成绩:\n");
for(i=0;i<3;i++)
{
printf("输入第%d一门课的成绩;\n",i+1);
scanf("%d",&m.s[i]);
sum+=m.s[i];
}
m.ave=sum/3; //求新插入的这个学生的平均分
printf("这个学生的均分是%d\n",m.ave);
//遍历找位置,
for(i=0;i<3;i++)
{
if(stu[i].ave>m.ave)
{
t=i;
}
}
for(i=0;i<=t;i++)
{
if((fwrite(&stu[i],sizeof(struct ST),1,fp))!=1)
printf("file write error");
}
fwrite(&m,sizeof(struct ST),1,fp);
for(i=t+1;i<M;i++)
{
if((fwrite(&stu[i],sizeof(struct ST),1,fp))!=1)
printf("file write error");
}
//算法思想:先写入前面的有序的部分,然后再写入待插入的这个结构体,最后再插入后面一截即可
//注意:待插入的这个结构体
rewind(fp);
if((fp=fopen("t.dat","rb"))==NULL)
{
printf("error");
exit(0);
}
printf("输出排序好的顺序:\n");
for(i=0;i<4;i++)
{
// fseek(fp,i*sizeof(struct s),0);//移动文件标志
fread(&stu[i],sizeof(struct ST),1,fp);
printf("%-10s %4d %4d %-15s %4f\n",stu[i].name,stu[i].num,stu[i].age,stu[i].addr,stu[i].ave);
}
fclose(fp);
}
//主函数
int main()
{
//FILE *fp;
int i,k=0,j;
float sum=0;
printf("输入学生的数据:\n");
for(i=0;i<3;i++)
{ printf("请输入第%d学生的学号和姓名(分别用空格隔开)\n",i+1);
scanf("%s%d%d%s",stu[i].name,&stu[i].num,&stu[i].age,stu[i].addr);
sum=0;
for(j=0;j<3;j++)
{
printf("请输入第%d学生的第%d门课程成绩(分别用空格隔开)\n",i+1,j+1);
scanf("%d",&stu[i].s[j]);
sum+=stu[i].s[j];
}
//计算的是每个学生的平均成绩
//要求读写到磁盘中,可以在结构体中定义一个ave属性,然后用fwrite一块写入磁盘。
stu[i].ave=sum/3;
}
save();
return 0;
//验证t.dat中是否有这个文件
}
注意方法:先比较原结构体中的排序好的平均成绩和现在需要插入的平均成绩的大小关系,找出需要插入的平均成绩所在的位置
然后记录这个点,,记住:t。最后先把t位置之前的都写入文件中,再写入t位置上的数据(即要插入的数据),最后把要插入数据之后的所有内容全部写入文件,即实现了插入后排序
如有不足,请指正!!