PHP SplFileObject的 fgets()和fgetcsv()无法在seek()后无法返回正确的行.

查看:184
本文介绍了PHP SplFileObject的 fgets()和fgetcsv()无法在seek()后无法返回正确的行.的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

我看已经有人提交过类似的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接口。

seekcurrent都是SeekableIterator接口里的函数,文件行数从0开始数。

fgets的文档是这样说的:

Returns a string containing the next line from the file, or FALSE on error.

返回的是下一行

那么刚打开的文件的下一行是什么?第二行吗?不对。对fgets来说,文件刚打开处于类似-1的状态,下一行就是文件的第一行(也是seek(0)对应的那行)。

实现上,SplFileObject内部有行数记录current_line_num和当前行内容current_line,刚打开文件时current_line为空,对fgets来说就处于类似-1的状态。

打开文件时,current_line_num = 0, current_line = NULLfgets返回文件的第一行后current_line不为空,但是current_line_num仍然为0

seek(0)会让current_line_num = 0, current_line = NULL,所以这时fgets行为还是正确的。

但是seek(n),n > 0的时候,会让current_line_num = ncurrent_line != NULL,这时fgets就会变成读第n + 1行。

这篇关于PHP SplFileObject的 fgets()和fgetcsv()无法在seek()后无法返回正确的行.的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆