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);

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