關於feof函式多讀一次的問題
在完成通訊錄的過程中總是多讀出一個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()。