C语言链表读取二进制文件 100

StudentCreat()//创建链表{Studenthead;//头节点Studentp1=NULL;//p1保存创建的新节点的地址Studentp2=NULL;//... Student Creat()//创建链表
{
Student head; //头节点
Student p1=NULL; //p1保存创建的新节点的地址
Student p2=NULL; //p2保存原链表最后一个节点的地址
char a[10]={"stop"}; //用于停止输入学生信息
p1=(Student)malloc(LEN); //开辟一个新节点
p2=p1; //如果节点开辟成功,则p2先把它的指针保存下来以备后用

if(p1==NULL)
{
printf("无法创建,请稍后重试");
return NULL;
}
else
{ head=NULL;
printf("请输入第%d位学生的信息,以学号为stop结束\n",n+1);
scanf("%s",p1->no);
}
while(strcmp(p1->no,a)!=0) //只要学号不为stop,就继续录入下一个节点
{
scanf("%s %s %s %d%d%d%f%f%f%f%f%f",p1->name,p1->sex,p1->phon,&p1->birth.year,&p1->birth.month,&p1->birth.day,&p1->score.chi,&p1->score.eng,&p1->score.mat,&p1->score.eva,&p1->score.tea,&p1->score.mor);
p1->score.ave=(p1->score.eng+p1->score.mat+p1->score.chi)/3;
p1->score.total=(p1->score.ave*0.6+p1->score.eva*0.1+p1->score.tea*0.2+p1->score.mor*0.1);
n+=1; //节点总数增加1个
if(n==1) //如果节点总数是1,则head指向刚创建的节点p1
{
head=p1;
p2->next=NULL;
}
else
{
p2->next=p1;
}

p2=p1; //把p1的地址给p2保留,然后p1产生新的节点
p1=(Student)malloc(LEN);
printf("请输入第%d位学生的信息,以学号为stop结束\n",n+1);
scanf("%s",p1->no);

}
p2->next=NULL;
free(p1); //p1->no为0的时候跳出了while循环,并且释放p1
p1=NULL; //把释放的变量清空置为NULL,防止其变成野指针
return head; //返回创建链表的头指针

}
Student Load()
{
n=0;
FILE *fp;
fp=fopen("Student.txt","rb");
if ((fp=fopen("Student.txt","rb"))==NULL)
{
printf("无法读取Student.txt\n");
return NULL;
}
Student p1,p2,head;
p1=(Student)malloc(LEN);
p2=p1;
if(p1==NULL)
{
printf("读取失败!内存空间申请不足!\n");
return NULL;
}
head=NULL;
while(feof(fp))
{
fread(p1,sizeof(LEN),1,fp);
if(n==0)
{
head=p1;
p2->next=NULL;
}
else
{
p2->next=p1;
p2=p1;
p2->next=NULL;
}
p2=p1;
p1=(Student)malloc(LEN);
n+=1;
}
free(p1);
p1=NULL;
fclose(fp);
return head;
}

int save1(Student p,int n)
{ FILE *fp;
fp=fopen("Student.bin","wb");
Student head;
head=p;//p为已经构建好的链表
//if((fp=fopen("Student.txt","ab+"))==NULL)
if((fp=fopen("Student.txt","wb"))==NULL)
{
printf("无法打开Student.txt!\n");
return -1;
}
while(p!=NULL)
{
fwrite(p,sizeof(LEN),1,fp);
p=p->next;
}
fclose(fp);
printf("成功保存文件!\n");
return 1;
}

想请教下问题出在哪。。以上是主要的几个函数,每次运行的时候都会提示输入第一个学生的信息,没有加载
void Run()
{
Student stu;
stu=Load();
stu=Creat();
}
int main()
{
Run();
return 0;
}
展开
 我来答
折柳成萌
高粉答主

2017-09-21 · 繁杂信息太多,你要学会辨别
知道顶级答主
回答量:4.4万
采纳率:96%
帮助的人:6307万
展开全部
关键代码应该是这样的
FILE *fp = fopen("file","rb");
char *p = node->data;
while(!feof(fp))
*p++ = fgetc(fp);
fclose(fp);
//**********************以上读*******************
FILE *fp = fopen("file","wb");
char *p = node->data;
while( p < node->data+len)
fputc(fp,*p++);
fclose(fp);
//**********************以上写*******************
wenqing8585
2017-09-21 · TA获得超过8252个赞
知道大有可为答主
回答量:8078
采纳率:70%
帮助的人:3878万
展开全部
while(feof(fp)) 要改成 while(!feof(fp))
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式