我看已经有人提交过类似的bug报告, 但现在还存在这样的情况. 请问是否有什么解决办法么?
如果执行current()是可以返回正确的行内容的
https://bugs.php.net/bug.php?...
<?php
$f = new SplFileObject(__FILE__);
$f->seek(0);
echo $f->fgets();
$f->seek(1);
echo $f->fgets();
$f->seek(2);
echo $f->fgets();
output:
<?php
$f->seek(0); (从第2行开始错误)
echo $f->fgets();
这个问题是因为
SplFileObject
实现了两套不相容的文件读取接口:SeekableIterator
和类C的fgets
接口。seek
和current
都是SeekableIterator
接口里的函数,文件行数从0开始数。fgets
的文档是这样说的:返回的是下一行。
那么刚打开的文件的下一行是什么?第二行吗?不对。对
fgets
来说,文件刚打开处于类似-1的状态,下一行就是文件的第一行(也是seek(0)
对应的那行)。实现上,
SplFileObject
内部有行数记录current_line_num
和当前行内容current_line
,刚打开文件时current_line
为空,对fgets
来说就处于类似-1的状态。打开文件时,
current_line_num = 0
,current_line = NULL
,fgets
返回文件的第一行后current_line
不为空,但是current_line_num
仍然为0。seek(0)
会让current_line_num = 0
,current_line = NULL
,所以这时fgets
行为还是正确的。但是
seek(n)
,n > 0的时候,会让current_line_num = n
,current_line != NULL
,这时fgets
就会变成读第n + 1行。