在完成通信录的过程中总是多读出一个0,对此我进行了多次调试。
下面是成功的代码
void load_txl(Link *head)
{
Link temp = *head;
Link newnode = NULL;
FILE *fp;
int i;
if((fp = fopen("txl.txt","r")) == NULL)
{
printf("打开失败!\n");
exit(-1);
}
//fseek(fp,0,SEEK_END);
//len = ftell(fp);
fseek(fp,0,SEEK_SET);
/*newnode = (Link)malloc(sizeof(Txl));
fread(newnode,sizeof(Txl),1,fp);
printf("%s %s %s %d %s %s\n",newnode->num,newnode->name,newnode->sex,newnode->age,newnode->tele,newnode->addr);*/
while(!feof(fp))
{
newnode = (Link)malloc(sizeof(Txl));
//if(fread(newnode,sizeof(Txl),1,fp) == -1)
//{
// printf("Error!\n");
// exit(-1);
//}
if(fread(newnode,sizeof(Txl),1,fp) == 0)
{
break;
}
printf("%s %s %s %d %s %s\n",newnode->num,newnode->name,newnode->sex,newnode->age,newnode->tele,newnode->addr);
//j = fscanf(fp,"%s %s %s %d %s %s\n",newnode->num,newnode->name,newnode->sex,&newnode->age,newnode->tele,newnode->addr);
temp->next = newnode;
newnode = NULL;
temp = temp->next;
}
if(feof(fp))
{
free(newnode);
newnode = NULL;
}
fclose(fp);
}
注释部分是我进行的探索,是我的思路历程,其实只要对其返回值进行判断即可。
原因就是在读完最后一个字符后,fp->flag仍然没有被置为_IOEOF,因而feof()仍然没有探测到文件结尾。直到再次调用fgetc()执行读操作,feof()才能探测到文件结尾。feof()可以用EOF代替吗?不可以。fgetc返回-1时,有两种情况:读到文件结尾或是读取错误。因此我们无法确信文件已经结束,
因为可能是读取错误! 这时我们需要feof()。