PHP 的文件指针函数 feof()的问题
我写了一个abc.txt,内容为“helloworld!howareyou!”filesize的结果为24.这个时候如果我用了读取的循环while(!feof($fope...
我写了一个abc.txt,内容为“hello world!how are you!” filesize的结果为24.这个时候如果我用了读取的循环
while(!feof($fopen)){
echo fgetc($fopen);
}
,此时ftell返回24没问题,我有var_dump($fopen)返回true;
但是,接下来执行rewind($fopen),fseek($fopen,0,SEEK_END),再去var_dump($feof($fopen)) 返回值变成了false,即使fseek($fopen,345,SEEK_END) 再去判断feof返回的依然是false
是feof使用的局限 还是我哪里处理错了?
叙述的有点啰嗦,烦请看完 谢谢! 展开
while(!feof($fopen)){
echo fgetc($fopen);
}
,此时ftell返回24没问题,我有var_dump($fopen)返回true;
但是,接下来执行rewind($fopen),fseek($fopen,0,SEEK_END),再去var_dump($feof($fopen)) 返回值变成了false,即使fseek($fopen,345,SEEK_END) 再去判断feof返回的依然是false
是feof使用的局限 还是我哪里处理错了?
叙述的有点啰嗦,烦请看完 谢谢! 展开
展开全部
rewind($fopen)这个是把指针定到开头了(等价于fseek(stream, 0, SEEK_SET)),但是你紧接着又fseek($fopen,0,SEEK_END),把指针定到结尾,(这两个操作连着的话无意义吧),定到结尾了。
你这个问题一开始看fseek还是有点乱的,你就想成是把光标移动到宏扮蚂结尾的!之后,但是又在eof之前。如果你fseek($fopen,0,SEEK_END)后,再fgetc($fopen);一次,再var_dump($feof($fopen)) 就是true了。
另外你这里有个错误,SEEK_END需要缺和配合负数偏移使用的,正数右移,负数左移,因为已经是结尾了,右移无意义了。则你fseek($fopen,345,SEEK_END) 这里是错的。
还有fseek如果执行失败(比如offset超过文件自身大小蔽埋),则不改变stream指向的位置的。
你这个问题一开始看fseek还是有点乱的,你就想成是把光标移动到宏扮蚂结尾的!之后,但是又在eof之前。如果你fseek($fopen,0,SEEK_END)后,再fgetc($fopen);一次,再var_dump($feof($fopen)) 就是true了。
另外你这里有个错误,SEEK_END需要缺和配合负数偏移使用的,正数右移,负数左移,因为已经是结尾了,右移无意义了。则你fseek($fopen,345,SEEK_END) 这里是错的。
还有fseek如果执行失败(比如offset超过文件自身大小蔽埋),则不改变stream指向的位置的。
更多追问追答
追问
首先谢谢 最后一段你指出的问题我都知道,我困惑的是 我循环过后 通过ftell得到的指针位置是24,此时feof为true
但是 fseek($fopen,0,SEEK_END),将指针指向末尾,此时 ftell也是24,但是feof却变成了false,
指针位置都相同,都指向末尾,为什么foef的返回值不同?谢谢
追答
这个是跟你打开文件的方式有关。
你可能为了方便,打开txt文件的时候,使用了 a+模式,反正起码是读写的模式,
“a+” 打开文件用于读和添加,添加操作包括在新数据写到该文件之前删除EOF标志,
在写完成后恢复该EOF标志。如果该文件不存在,则是建立它。
在打开用于读写的文件中,fopen检查文件结尾的一个EOF,如果存在这个的话就会删除它,这样做是因为使用fseek和ftell函数在一个以EOF结尾的文件中移动时可能导致fseek不适当地接近文件末尾。
所以你上面的代码找不到EOF啦,但是你如果这个时候fgetc读一次的话,就会回复EOF,就能
读取到了。
这个太细了,不要太追究啦。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询