PHP 获取多行打开文件句柄的最后一行
PHP get the last line of an open file handle with multiple lines
这看起来应该是一件简单的事情,但是当 return 处理打开文件句柄的最后一行时,我在使用 fgetc() 时遇到了一些麻烦。我想要做的是 return 写入句柄的最后一行,如果句柄只有一行,我有以下内容:
function getLastLineFromHandle($handle)
{
$seeker = function($handle) use (&$seeker) {
fseek($handle, -1, SEEK_CUR);
return ftell($handle) ?
$seeker($handle) :
$handle;
};
return trim(fgets($seeker($handle)));
}
$handle = fopen('php://temp', 'w+');
fwrite($handle, 'Hello World'.PHP_EOL);
//prints Hello World
print getLastLineFromHandle($handle);
问题是当我将多行写入句柄时,将 fgetc() 添加到检查条件似乎不起作用,例如:
function getLastLineFromHandle($handle)
{
$seeker = function($handle) use (&$seeker) {
fseek($handle, -1, SEEK_CUR);
return ftell($handle) && fgetc($handle) != PHP_EOL ?
$seeker($handle) :
$handle;
};
return trim(fgets($seeker($handle)));
}
如果向句柄写入多行并且 fgetc($handle) 似乎每次都 return 相同的字符,则此 return 为空白?
我确定我错过了一些非常简单的事情,但是任何指示都会很棒,因为这让我发疯!
谢谢。
发现上面示例中缺少的内容,结果是在开始时指针处存在意外的行尾字符,因此移动一个位置解决了问题,例如:
function getLastLineFromHandle($handle)
{
$seeker = function($handle) use (&$seeker) {
fseek($handle, -2, SEEK_CUR);
return ftell($handle) && fgetc($handle) != PHP_EOL ?
$seeker($handle) :
$handle;
};
return trim(fgets($seeker($handle)));
}
在探索这个的同时,我还发现了另一种做同样事情的方法,感谢@TheMarlboroMan 关于寻求结束的评论引发了这个:
function getLastLineFromHandle($handle)
{
$seeker = function($handle, $cur = -2, $line = '') use (&$seeker)
{
$char = '';
if (fseek($handle, $cur, SEEK_END) != -1) {
$char = fgetc($handle);
$line = $char.$line;
}
return ftell($handle) > 0 && $char != PHP_EOL?
$seeker($handle, $cur-1,$line) :
$line;
};
return trim($seeker($handle));
}
这还没有经过重构循环,但是它通过了与上述其他方法相同的测试。这个解决方案似乎有点混乱 return 行字符串而不是文件句柄,因为那是你所期望的。
将此设置为已解决,但如果有人有不同的方法,欢迎发表评论:)
这看起来应该是一件简单的事情,但是当 return 处理打开文件句柄的最后一行时,我在使用 fgetc() 时遇到了一些麻烦。我想要做的是 return 写入句柄的最后一行,如果句柄只有一行,我有以下内容:
function getLastLineFromHandle($handle)
{
$seeker = function($handle) use (&$seeker) {
fseek($handle, -1, SEEK_CUR);
return ftell($handle) ?
$seeker($handle) :
$handle;
};
return trim(fgets($seeker($handle)));
}
$handle = fopen('php://temp', 'w+');
fwrite($handle, 'Hello World'.PHP_EOL);
//prints Hello World
print getLastLineFromHandle($handle);
问题是当我将多行写入句柄时,将 fgetc() 添加到检查条件似乎不起作用,例如:
function getLastLineFromHandle($handle)
{
$seeker = function($handle) use (&$seeker) {
fseek($handle, -1, SEEK_CUR);
return ftell($handle) && fgetc($handle) != PHP_EOL ?
$seeker($handle) :
$handle;
};
return trim(fgets($seeker($handle)));
}
如果向句柄写入多行并且 fgetc($handle) 似乎每次都 return 相同的字符,则此 return 为空白?
我确定我错过了一些非常简单的事情,但是任何指示都会很棒,因为这让我发疯!
谢谢。
发现上面示例中缺少的内容,结果是在开始时指针处存在意外的行尾字符,因此移动一个位置解决了问题,例如:
function getLastLineFromHandle($handle)
{
$seeker = function($handle) use (&$seeker) {
fseek($handle, -2, SEEK_CUR);
return ftell($handle) && fgetc($handle) != PHP_EOL ?
$seeker($handle) :
$handle;
};
return trim(fgets($seeker($handle)));
}
在探索这个的同时,我还发现了另一种做同样事情的方法,感谢@TheMarlboroMan 关于寻求结束的评论引发了这个:
function getLastLineFromHandle($handle)
{
$seeker = function($handle, $cur = -2, $line = '') use (&$seeker)
{
$char = '';
if (fseek($handle, $cur, SEEK_END) != -1) {
$char = fgetc($handle);
$line = $char.$line;
}
return ftell($handle) > 0 && $char != PHP_EOL?
$seeker($handle, $cur-1,$line) :
$line;
};
return trim($seeker($handle));
}
这还没有经过重构循环,但是它通过了与上述其他方法相同的测试。这个解决方案似乎有点混乱 return 行字符串而不是文件句柄,因为那是你所期望的。
将此设置为已解决,但如果有人有不同的方法,欢迎发表评论:)