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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

熔钧

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值