首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C语言的fread()读资料出错

2013-07-04 
C语言的fread()读文件出错/*本程序是从一个文件中读取数据,包含学生的编号,姓名,各门成绩,平均成绩,源文件

C语言的fread()读文件出错
/*
本程序是从一个文件中读取数据,包含学生的编号,姓名,各门成绩,平均成绩,源文件中数已经是按升序排列,要求实现再插入一个学生的数据且也是升序排列并生成一个新文件
*/
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define SIZE 5
typedef struct{
float cprogram;
float advmath;
float english;
}SCORE;

typedef struct student{
int number;
char name[15];
SCORE testcore;
float avescore;
}STU;

float average(SCORE * sc){
float ave=((*sc).cprogram + (*sc).advmath + (*sc).english)/3;
return ave;
}
int * search(STU stue[],STU *ps){//寻找插入点
int insr=0;//指示器的作用
int * eye=&insr;
STU * pso=stue;
while(pso){
if(pso->avescore < ps->avescore){
pso++;
insr++;
}
else
break;//ps->avescore is the minimum;
}
//*eye=insr;
//printf("%d\n",*eye);//错误的根源,错在哪里有待考究
return eye;
}
void insert(STU stud[],int * pi,STU traValue,FILE * fpth){//插入
int i;
STU *list[SIZE+1];
//STU trys[SIZE+1];
list[0]=stud;
i=0;
for(i=0;i<SIZE;i++){
list[i]=&stud[i];
}
for(i=0;i<SIZE;i++){
printf("%d %s %.2f %.2f %.2f %.2f\n",list[i]->number,list[i]->name,list[i]->testcore.cprogram,list[i]->testcore.advmath,list[i]->testcore.english,list[i]->avescore);
}
for(i=SIZE-1;i>=*pi;i--){
printf("right\n");
list[i+1]=&stud[i];
//printf("%d %s %.2f %.2f %.2f %.2f\n",list[i]->number,list[i]->name,list[i]->testcore.cprogram,list[i]->testcore.advmath,list[i]->testcore.english,list[i]->avescore);
}
printf("error\n");
list[*pi]=&traValue;
printf("error\n");
for(i=0;i<=SIZE;i++){
printf("%d %s %.2f %.2f %.2f %.2f\n",list[i]->number,list[i]->name,list[i]->testcore.cprogram,list[i]->testcore.advmath,list[i]->testcore.english,list[i]->avescore);
}
for(i=0;i<SIZE+1;i++){
//printf("write\n");
fwrite(list[i],sizeof(STU),1,fpth);
/*printf("%derror%d\n",ferror(fpth),i);
printf("%d\n",fwrite(list[i],sizeof(STU),1,fpth));//测试调用成功否
printf("%d\n",ferror(fpth));//测试fwrite()调用是否出错
    printf("%d %s %.2f %.2f %.2f %.2f\n",list[i]->number,list[i]->name,list[i]->testcore.cprogram,list[i]->testcore.advmath,list[i]->testcore.english,list[i]->avescore);
*/}
/*rewind(fpth);
for(i=0;i<SIZE+1;i++){
fread(&trys[i],sizeof(STU),1,fpth);
printf("%derror%d\n",ferror(fpth),i);
//printf("%d\n",ferror());//测试调用是否出错
   printf("%d %s %.2f %.2f %.2f %.2f\n",trys[i].number,trys[i].name,trys[i].testcore.cprogram,trys[i].testcore.advmath,trys[i].testcore.english,trys[i].avescore);
}*/

}
int main(void){
FILE * obfp;
FILE * newfp;
int i=0;
int * p;
int n;
float ave;
STU stue[SIZE],stu;
STU newstue[SIZE+1];
if((obfp=fopen("f:\\求职\\newstu.txt","rb"))==NULL){
printf("open file failed\n");
exit(0);
}
printf("the original data:\n");
for(;i<SIZE;i++){
fread(&stue[i],sizeof(STU),1,obfp);
printf("%d %s %.2f %.2f %.2f %.2f\n",stue[i].number,stue[i].name,stue[i].testcore.cprogram,stue[i].testcore.advmath,stue[i].testcore.english,stue[i].avescore);


}
if((newfp=fopen("f:\\求职\\stunew1.txt","wb"))==NULL){
printf("open file failed\n");
exit(0);
}
printf("now please input a new student's data\n");
scanf("%d%s%f%f%f",&stu.number,stu.name,&stu.testcore.cprogram,&stu.testcore.advmath,&stu.testcore.english);
ave=average(&stu.testcore);
stu.avescore=ave;
p=search(stue,&stu);
n=*p;
printf("%d\n",n);
insert(stue,&n,stu,newfp);
rewind(newfp);
for(i=0;i<SIZE+1;i++){
fread(&newstue[i],sizeof(STU),1,newfp);//这里出问题了,读出来是乱码
printf("%d\n",ferror(newfp));//测试调用是否出错
   printf("%d %s %.2f %.2f %.2f %.2f\n",newstue[i].number,newstue[i].name,newstue[i].testcore.cprogram,newstue[i].testcore.advmath,newstue[i].testcore.english,newstue[i].avescore);
}
fclose(obfp);
fclose(newfp);
return 1;

}
经过编译能运行,但最终在主函数中读写入新文件的数据时读到的是乱码,想了好几天都没想出来哪里出问题了
恳请各位高手解惑,小弟感激不尽!!!
[解决办法]
写方式打开的文件,为何去读????!!!

热点排行