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

#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失败。其他方面我确定没问题因为这是个模拟信息管理系统,之前其他函数使用链表一直没错

阿波罗的战车
浏览 552回答 2
2回答

白衣染霜花

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

30秒到达战场

可能是把studentMessage结构中的next指针写进了文件的缘故。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python
Java