烦人的 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);/*******程序出错地方*********/
这个地方的第三个参数应该是1吧,你写成3的话,会导致越界的!
[解决办法]
#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);
}
}
修改了一下你的程序,现在应该是可以了。参考一下吧。在文件打开判断时有问题,你可以参考一下我的处理形式,当然也可以其他方法,不过应该注意优先级。
[解决办法]
程序中有四个比较严重的错误:
1、文件打开操作作为条件时要加上括号,因为==的优先级要高于=的优先级,如果不加括号会引起一些莫名其妙的错误;
2、分数打印输出时应该是浮点输出将%d改为%f格式;
3、第三个错误是直接导致你为什么老是打开失败的最重要的原因,因为在排序函数中你前后写的文件名不一致。写的是studt_sort,读的是stud_sort。如果不打开失败就不可思议了。
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);
}
}