1. 程式人生 > >關於feof函式多讀一次的問題

關於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()。