LINUX下使用風格特色讀去文件最後一行兩次

fgets兩次讀取文件最後一行?
#include <stdlib.h>;
#include <stdio.h>;

int main()
{
FILE *fp;
char ch[11];
fp = fopen("jjk.txt","r");
while(!feof(fp))     //-----------------問題在這裏
{
   memset(ch, 0, sizeof(ch));
   fgets((char *)ch, sizeof(ch)-1, fp);
   printf("%s",ch);
}
fclose(fp);
}

[/code]
jjk.txt內容:
aaa
bbb
輸出結果:
aaa
bbb
bbb

問題原因解釋:
feof是ANSI標準定義的:在遇到文件結束時返回非0值。
對於象DOS系統,這比較方便。因爲文件有明確的結束標誌EOF。
對於UNIX,就稍微麻煩一點。因爲文件沒有結束標誌,只有通過當前指針和文件長度來判斷文件是否結束。當read時,先調用trap進入核心態,由FILE->;ile->;inode,取得文件的物理地址,然後取得文件的剩餘的長度,比較該長度是否爲0,如果爲0則置文件結束標誌;如果不爲0,則比較該長度和要讀的長度,取其中的小值,並將文件內容讀入用戶地址。
具體到你所遇到的現象就比較清晰了,讀文件最後一行的fgets(也是調用read的)被調用的時候,該文件的剩餘長度不爲0,所以不置文件結束標誌。而再fgets時,文件的剩餘長度爲0,文件結束標誌被置且馬上返回。
另外,注意到feof返回的是_IOEOF而不是ANSI定義的EOF。

解決方法:

ile(fgets(ch, sizeof(ch)-1, fp) != NULL)
   printf("%s",ch);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章