首页
社区
课程
招聘
[原创] 文件读写中,容易忽略的细节
发表于: 2018-4-21 11:48 2581

[原创] 文件读写中,容易忽略的细节

2018-4-21 11:48
2581

hello


[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2018-4-23 22:51 被Tipingpoint编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (4)
雪    币: 2058
活跃值: (1666)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分析!
2018-4-21 12:30
0
雪    币: 23080
活跃值: (3432)
能力值: (RANK:648 )
在线值:
发帖
回帖
粉丝
3

feof()的作用是读取文件在内存中所对应结构体中的EOF标志位,这个标志位被置为TRUE的时机发生在读文件之后(和其文件指针位置无关)。
即第一次执行fgets()操作后读完了helloworld\n,文件指针指向了tobe\n的t的位置,第二次执行fgets()后文件指针指向了文件EOF的位置(注意,文件指针指向了EOF的位置时并没有发生读取EOF位置的操作,因为fgets()读到了\n就结束了,所以没有人知道现在是文件结束了,所以结构体中的EOF标志位并没有置为TRUE),因此第三次while循环的条件还为真,继续进入循环体,读取到了当前位置的结束标志才将内存中文件结构体的EOF标志位置为TRUE,也没有读出任何内容到缓冲区,所以此时打印出tobe\n的原因就是楼主分析的情况了。
代码这样写就可以避免第三次进while循环了:

fgets(szBuff, sizeof(szBuff), pFile);
while(!feof(pFile))
{
    printf("%s", szBuffer);
    fgets(szBuff, sizeof(szBuff), pFile);
}
最后于 2018-4-22 00:20 被KevinsBobo编辑 ,原因:
2018-4-22 00:18
0
雪    币: 23080
活跃值: (3432)
能力值: (RANK:648 )
在线值:
发帖
回帖
粉丝
4
补充一下,EOF标志位在pFile指向的结构体中,楼主下次调试的时候看一下就清楚了  ^_^
2018-4-22 00:30
0
雪    币: 2222
活跃值: (739)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
5
  感谢版主的分析和讲解,又学到知识了
2018-4-22 08:39
0
游客
登录 | 注册 方可回帖
返回
//