#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);
}
添加回答
举报
0/150
提交
取消