烦人的 stream!=NULL,求老师帮忙!
代码如下:#define _CRT_SECURE_NO_DEPRECATE
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Student//用于存放学号和成绩
{
int num;/*用于存放学号*/
float score[6];/*用于存放成绩,共5门课,最后列是平均分*/
};
int main()
{
FILE *fp;
int i,j;
struct Student stud[3],*p=stud;
void aver(struct Student *p);//计算平均分,并将输入的学号和成绩以及平均分存到文件stud中
void sort(struct Student *p);//读取stud,将成绩按平均分由高到低排序,再将排好序的同学按学号、成绩、平均分存到文件stud_sort中
for(i=0;i<3;i++)//输入学号和成绩
{
printf("请输入学号:\n");
scanf("%d",&stud[i].num);
printf("请输入学号为%d的同学的5门课成绩\n",stud[i].num);
for(j=0; j<5; j++)
{
scanf("%f",&stud[i].score[j]);
}
}
aver(p);//算平均分并将数据写入文件stud
if(fp=fopen("stud","rb")==NULL)//读出文件stud的数据
{
printf("文件打开失败");
exit(0);
}
else
{
printf("排序前的成绩排列如下:\n功课1\t功课2\t功课3\t功课4\t功课5\t平均分\n");
for(i=0;i<3;i++)
{
fread(p+i,sizeof(struct Student),1,fp);
printf("%d\t",stud[i].num);//打印学号
for(j=0;j<6;j++)//打印各门课分数及平均分
{
printf("%d\t",stud[i].score[j]);
}
printf("\n");
}
fclose(fp);
}
sort(p);//按平均分排序并写入stud_sort
if(fp=fopen("stud_sort","rb")==NULL)
{
printf("文件打开失败");
exit(0);
}
else
{
printf("排序后的成绩排列如下:\n功课1\t功课2\t功课3\t功课4\t功课5\t平均分\n");
for(i=0;i<3;i++)
{
fread(p+i,sizeof(struct Student),1,fp);
printf("%d\t",stud[i].num);//打印学号
for(j=0;j<6;j++)//打印各门课分数及平均分
{
printf("%d\t",stud[i].score[j]);
}
printf("\n");
}
fclose(fp);
}
system("pause");
return 0;
}
void aver(struct Student *p)
{
FILE *fp;
int i,j;
for(i=0;i<3;i++)//求出平均分放在最后一列
{
(p+i)->score[5]=0;
for(j=0;j<5;j++)
{
(p+i)->score[5]+=(p+i)->score[j];
}
(p+i)->score[5]=(p+i)->score[5]/5;
}
if(fp=fopen("stud","wb")==NULL)
{
printf("aver文件打开失败");
exit(0);
}
else//将学号和成绩写入文件stud
{
for(i=0;i<3;i++)
{
fwrite(p+i,sizeof(struct Student),3,fp);/*******程序出错地方*********/
}
fclose(fp);
}
}
void sort(struct Student *p)
{
FILE *fp;
int i,j,k,temp;
float t;
for(i=0;i<2;i++)//按平均分由高到低排序
{
k=i;
for(j=i+1;j<3;j++)
{
if ((p+i)->score[5]<(p+j)->score[5])
{
k=j;
}
}
if (i!=k)
{temp=(p+i)->num;/*将平均分最高的同学学号放到前面*/
(p+i)->num=(p+k)->num;
(p+k)->num=temp;
for(j=0;j<6;j++)/*将成绩和平均分也放到前面*/
{
t=(p+i)->score[j];
(p+i)->score[j]=(p+k)->score[j];
(p+k)->score[j]=t;
}
}
}
if(fp=fopen("studt_sort","wb")==NULL)
{
printf("sort文件打开失败");
exit(0);
}
else
{
for(i=0;i<3;i++)/*将排好序的同学存入stud_sort中*/
{
fwrite(p+i,sizeof(struct Student),1,fp);
}
fclose(fp);
}
}
补充:本人在项目文件夹已经发现stud文件,大小为0k.
[解决办法]
fwrite(p+i,sizeof(struct Student),3,fp);/*******程序出错地方*********/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Student //用于存放学号和成绩
{
int num;/*用于存放学号*/
float score[6];/*用于存放成绩,共5门课,最后列是平均分*/
};
//计算平均分,并将输入的学号和成绩以及平均分存到文件stud中
void aver(struct Student *p);
//读取stud,将成绩按平均分由高到低排序,再将排好序的同学按学号、成绩、平均分存到文件stud_sort中
void sort(struct Student *p);
int main()
{
FILE *fp;
int i,j;
struct Student stud[3],*p=stud;
for(i=0;i<3;i++)//输入学号和成绩
{
printf("请输入学号\n");
scanf("%d",&stud[i].num);
printf("请输入学号为%d的五门成绩\n", stud[i].num);
for(j=0; j<5; j++)
{
scanf("%f",&stud[i].score[j]);
}
}
aver(p);//算平均分并将数据写入文件stud
if( NULL == (fp=fopen("stud","rb")) )//读出文件stud的数据
{
printf("文件打开失败");
exit(1);
}
else
{
printf("排序前的成绩排列如下:\n学号\t功课1\t功课2\t功课3\t功课4\t功课5\t平均分\n");
for(i=0;i<3;i++)
{
fread(p+i,sizeof(struct Student),1,fp);
printf("%02d\t",stud[i].num);//打印学号
for(j=0;j<6;j++)//打印各门课分数及平均分
{
printf("%2.1lf\t",stud[i].score[j]);
}
printf("\n");
}
fclose(fp);
}
sort(p);//按平均分排序并写入stud_sort
if( NULL == (fp=fopen("stud_sort","rb")))
{
printf("文件打开失败");
exit(0);
}
else
{
printf("排序后的成绩排列如下:\n学号\t功课1\t功课2\t功课3\t功课4\t功课5\t平均分\n");
for(i=0;i<3;i++)
{
fread(p+i,sizeof(struct Student),1,fp);
printf("%02d\t",stud[i].num);//打印学号
for(j=0;j<6;j++)//打印各门课分数及平均分
{
printf("%2.1lf\t",stud[i].score[j]);
}
printf("\n");
}
fclose(fp);
}
system("pause");
return 0;
}
void aver(struct Student *p)
{
FILE *fp;
int i,j;
for(i=0;i<3;i++)//求出平均分放在最后一列
{
(p+i)->score[5]=0;
for(j=0;j<5;j++)
{
(p+i)->score[5]+=(p+i)->score[j];
}
(p+i)->score[5]=(p+i)->score[5]/5;
}
if( NULL == (fp = fopen("stud","wb")) )
{
printf("aver文件打开失败");
exit(0);
}
else//将学号和成绩写入文件stud
{
for(i=0;i<3;i++)
{
fwrite(p+i,sizeof(struct Student),3,fp);/*******程序出错地方*********/
}
fclose(fp);
}
}
void sort(struct Student *p)
{
FILE *fp;
int i,j,k,temp;
float t;
for(i=0;i<2;i++)//按平均分由高到低排序
{
k=i;
for(j=i+1;j<3;j++)
{
if ((p+i)->score[5]<(p+j)->score[5])
{
k=j;
}
}
if (i!=k)
{
temp=(p+i)->num; /*将平均分最高的同学学号放到前面*/
(p+i)->num=(p+k)->num;
(p+k)->num=temp;
for(j=0;j<6;j++) /*将成绩和平均分也放到前面*/
{
t=(p+i)->score[j];
(p+i)->score[j]=(p+k)->score[j];
(p+k)->score[j]=t;
}
}
}
if( NULL == (fp=fopen("studt_sort","wb")) )
{
printf("sort文件打开失败");
exit(0);
}
else
{
for(i=0;i<3;i++)/*将排好序的同学存入stud_sort中*/
{
fwrite(p+i,sizeof(struct Student),1,fp);
}
fclose(fp);
}
}
4、还有一个就是aver函数中写入时fwrite(p+i, sizeof(struct Student), 3, fp);改为fwrite(p+i, sizeof(struct Student), 1, fp);原因你现在应该懂了。。。
程序修改如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
struct Student//用于存放学号和成绩
{
int num;/*用于存放学号*/
float score[6];/*用于存放成绩,共5门课,最后列是平均分*/
};
int main()
{
FILE *fp;
int i,j;
struct Student stud[3], *p=stud;
void aver(struct Student *p);//计算平均分,并将输入的学号和成绩以及平均分存到文件stud中
void sort(struct Student *p);//读取stud,将成绩按平均分由高到低排序,再将排好序的同学按学号、成绩、平均分存到文件stud_sort中
for(i=0;i<3;i++)//输入学号和成绩
{
printf("请输入学号:\n");
scanf("%d",&stud[i].num);
printf("请输入学号为%d的同学的5门课成绩\n",stud[i].num);
for(j=0; j<5; j++)
{
scanf("%f",&stud[i].score[j]);
}
}
aver(p);//算平均分并将数据写入文件stud
if((fp=fopen("stud","rb"))==NULL)//读出文件stud的数据
{
printf("文件打开失败");
exit(0);
}
else
{
printf("排序前的成绩排列如下:\n功课1\t功课2\t功课3\t功课4\t功课5\t平均分\n");
for(i=0;i<3;i++)
{
fread(p+i,sizeof(struct Student),1,fp);
printf("%d\t",stud[i].num);//打印学号
for(j=0;j<6;j++)//打印各门课分数及平均分
{
printf("%0.2f\t",stud[i].score[j]);
}
printf("\n");
}
fclose(fp);
}
sort(p);//按平均分排序并写入stud_sort
if((fp=fopen("studt_sort","rb"))==NULL)
{
printf("文件打开失败");
exit(0);
}
else
{
printf("排序后的成绩排列如下:\n功课1\t功课2\t功课3\t功课4\t功课5\t平均分\n");
for(i=0;i<3;i++)
{
fread(p+i,sizeof(struct Student),1,fp);
printf("%d\t",stud[i].num);//打印学号
for(j=0;j<6;j++)//打印各门课分数及平均分
{
printf("%0.2f\t",stud[i].score[j]);
}
printf("\n");
}
fclose(fp);
}
system("pause");
return 0;
}
void aver(struct Student *p)
{
FILE *fp;
int i,j;
for(i=0; i<3; i++)//求出平均分放在最后一列
{
(p+i)->score[5] = 0;
for(j=0;j<5;j++)
{
(p+i)->score[5]+=(p+i)->score[j];
}
(p+i)->score[5] = (p+i)->score[5]/5;
}
if((fp = fopen("stud","wb")) == NULL)
{
printf("aver文件打开失败");
exit(0);
}
else//将学号和成绩写入文件stud
{
for(i=0;i<3;i++)
{
fwrite(p+i, sizeof(struct Student), 1, fp); /*******程序出错地方*********/
}
fclose(fp);
}
}
void sort(struct Student *p)
{
FILE *fp;
int i,j,k,temp;
float t;
for(i=0;i<2;i++)//按平均分由高到低排序
{
k=i;
for(j=i+1;j<3;j++)
{
if ((p+i)->score[5]<(p+j)->score[5])
{
k=j;
}
}
if (i!=k)
{temp=(p+i)->num; /*将平均分最高的同学学号放到前面*/
(p+i)->num=(p+k)->num;
(p+k)->num=temp;
for(j=0;j<6;j++) /*将成绩和平均分也放到前面*/
{
t=(p+i)->score[j];
(p+i)->score[j]=(p+k)->score[j];
(p+k)->score[j]=t;
}
}
}
if((fp=fopen("studt_sort","wb"))==NULL)
{
printf("sort文件打开失败");
exit(0);
}
else
{
for(i=0;i<3;i++)/*将排好序的同学存入stud_sort中*/
{
fwrite(p+i,sizeof(struct Student),1,fp);
}
fclose(fp);
}
}