为了账号安全,请及时绑定邮箱和手机立即绑定

这里不太了解,为什么fwrite函数老多写一个呢?

这里不太了解,为什么fwrite函数老多写一个呢?

阿波罗的战车 2021-10-20 19:15:01
#define MES (struct studentMessage *)malloc(sizeof(struct studentMessage));//定义结构体typedef struct studentMessage{char name[15]; //姓名int id; //学号char sex[7]; //性别char collage[20]; //学院int Class; //班级struct studentMessage *next; //链表指针}MESSAGE;void savefilestu(MESSAGE *head){int i;FILE *fp=NULL;char q[20];MESSAGE *p;printf("请输入您要保存的文件名:");scanf("%s",q);fp=fopen(q,"w");p=head;for(;p;p=p->next) fwrite(p,sizeof(struct studentMessage),1,fp);fclose(fp);fp=fopen(q,"r");p=MES;p->next=NULL;for(;!feof(fp);){fread(p,sizeof(struct studentMessage),1,fp);outputstu(p);}fclose(fp);printf("已将信息保存到%s文件中!\n",q);printf("按任意键返回\n");getch();}经过测试,每次fwrite都多写一个数据(数值跟最后一个一样)但是在这个函数读取文件没问题,在其他地方读取文件时前面的正常,多写那个是乱码。求解决方法。。。。在这个函数里fread会读出多余的那个数据,数值跟最后一个一样。在其他地方里读出来的结果是前面正常最后多余那个为乱码。曾经设定fwrite的循环只进行一次,结果还是写了两个。如果在for里fwrite语句后直接加break,只写一个数据,为乱码。。。。 回二楼,改为wb,rb失败。其他方面我确定没问题因为这是个模拟信息管理系统,之前其他函数使用链表一直没错
查看完整描述

2 回答

?
白衣染霜花

TA贡献1796条经验 获得超10个赞

写的问题,你只要保证最后一个结构体的next域为NULL,就不会多写,
读的问题,你必须改成如下或者类似的形式,否则一定会多读出一个.
原因是,当你读到最后一组数后,此时feof( ) 并不为1.

fseek( fp, 0, SEEK_END );
int size = ftell( fp );
size /= sizeof(struct studentMessage);
fseek( fp, 0, SEEK_SET );

//while( !feof( fp ) )
for( i=0; i<size; i++ )
{
fread(p,sizeof(struct studentMessage),1,fp);
outputstu(p);
}

查看完整回答
反对 回复 2021-10-24
?
30秒到达战场

TA贡献1828条经验 获得超6个赞

可能是把studentMessage结构中的next指针写进了文件的缘故。

查看完整回答
反对 回复 2021-10-24
  • 2 回答
  • 0 关注
  • 544 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信