Bug #68466 [Opn]: Iterating SplFileObject shows empty line at end of file
| From: | requinix@php.net | Date: | Sun, 23 Nov 2014 00:13:28 +0000 |
| Subject: | Bug #68466 [Opn]: Iterating SplFileObject shows empty line at end of file | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-188749@lists.php.net to get a copy of this message | ||
Edit report at https://bugs.php.net/bug.php?id=68466&edit=1
ID: 68466
Updated by: requinix@php.net
Reported by: tim_siebels_aurich at yahoo dot de
Summary: Iterating SplFileObject shows empty line at end of
file
Status: Open
Type: Bug
Package: SPL related
PHP Version: 5.6.3
Block user comment: N
Private report: N
New Comment:
You need a trailing newline at the end of the file.
The regular file functions work on streams, not literally files. You have to try to read past the
end of the stream before feof() will know to return true. However when fread() reads the last time
there is nothing left so it returns false.
SplFileObject works on streams too but entire lines at a time. It also considers an empty line to
still be a line, which is why it returns "" instead of false - which fits with how most
text editors treat trailing newlines too.
I don't consider this to be a bug since (1) as fmargaine said the two code chunks are not
actually equivalent, and (2) the two methods read files in a slightly different way.
Previous Comments:
------------------------------------------------------------------------
[2014-11-22 23:53:21] tim_siebels_aurich at yahoo dot de
It sure does. But it is different from the fopen variation.
Take a second look at expected/actual.
I expect to have false at the end, because if you use fopen() you get false at the end. Either of
those should be changed.
------------------------------------------------------------------------
[2014-11-22 23:38:46] fmargaine@php.net
I can't actually reproduce having bool(false) at the end. On a clean build (5.5/5.6),
SplFileObject iterates correctly.
------------------------------------------------------------------------
[2014-11-22 22:44:54] fmargaine@php.net
Hi,
This is the equivalent you're looking for:
<?php
$o = new SplFileObject(__FILE__);
while (!$o->eof()) {
var_dump($o->fgets());
}
?>
However, it *is* weird that the iterator doesn't stop at the end of file.
------------------------------------------------------------------------
[2014-11-20 20:48:44] tim_siebels_aurich at yahoo dot de
Description:
------------
Iterating over a SplFileObject differs from using fopen() and friends.
SplFileObject is supposed to be an object oriented interface for the file handling functions. Their
output shouldn't be different.
Test script:
---------------
<?php
$o = new SplFileObject(__FILE__);
foreach($o as $key=>$val) {
var_dump($val);
}
/*
Should be the same as
$h = fopen(__FILE__, 'r');
while(!feof($h)) {
var_dump(fgets($h));
}
*/
Expected result:
----------------
string(3) "<?
"
string(34) "$o = new SplFileObject(__FILE__);
"
string(1) "
"
string(28) "foreach($o as $key=>$val) {
"
string(18) " var_dump($val);
"
string(2) "}
"
bool(false)
Actual result:
--------------
<?php
$o = new SplFileObject(__FILE__);
foreach($o as $key=>$val) {
var_dump($val);
}
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=68466&edit=1