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

如果在for里fwrite语句后直接加break,只写一个数据,为乱码。

如果在for里fwrite语句后直接加break,只写一个数据,为乱码。

PHP
精慕HU 2023-03-05 17:13:12
#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的循环只进行一次,结果还是写了两个。
查看完整描述

2 回答

?
跃然一笑

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

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

查看完整回答
反对 回复 2023-03-08
?
小怪兽爱吃肉

TA贡献1852条经验 获得超1个赞

写的问题,你只要保证最后一个结构体的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);
}


查看完整回答
反对 回复 2023-03-08
  • 2 回答
  • 0 关注
  • 144 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号