#48420 [Opn->Bgs]: stream_get_line() - invalid result when passing $length and $ending
| From: | iliaa@php.net | Date: | Mon, 01 Jun 2009 13:03:19 +0000 |
| Subject: | #48420 [Opn->Bgs]: stream_get_line() - invalid result when passing $length and $ending | ||
| References: | 1 | Groups: | php.bugs |
| Request: | Send a blank email to php-bugs+get-137946@lists.php.net to get a copy of this message | ||
ID: 48420
Updated by: iliaa@php.net
Reported By: ryan dot brothers at gmail dot com
-Status: Open
+Status: Bogus
Bug Type: Streams related
Operating System: Linux
PHP Version: 5.*, 6CVS(2009-05-29)
New Comment:
Thank you for taking the time to write to us, but this is not
a bug. Please double-check the documentation available at
http://www.php.net/manual/ and the instructions on how to
report
a bug at http://bugs.php.net/how-to-report.php
Because the file is still open there is no EOF, so the
stream_get_line()
cannot find the line's end and there is no EOF, thus it returns false.
Previous Comments:
------------------------------------------------------------------------
[2009-05-29 13:09:26] ryan dot brothers at gmail dot com
Thanks for your feedback. I tried it on the latest PHP 5.3 snapshot
and got the same results.
I noticed though when I run this:
<?php
fseek($fp, 0);
var_dump(fgets($fp, 6));
fseek($fp, 0);
var_dump(fgets($fp, 7));
?>
I get the expected results of:
string(5) "12345"
string(5) "12345"
Since the manual page for stream_get_line() states that this function
is identical to fgets() except for handling of the delimiter, should
stream_get_line() return the same results as fgets() for this case since
my delimiter is a newline?
Also, I'm not sure why these 2 calls to stream_get_line() return
different output:
<?php
fseek($fp, 0);
var_dump(stream_get_line($fp, 6));
fseek($fp, 0);
var_dump(stream_get_line($fp, 6, "\n"));
?>
Result:
string(5) "12345"
bool(false)
------------------------------------------------------------------------
[2009-05-29 09:00:45] lbarnaud@php.net
Verified. Actually this may be expected.
<?php
fseek($fp, 0);
var_dump(stream_get_line($fp, 6, "\n"));
?>
If stream_get_line() reads only 5 bytes here there is no way to tell if
this is the end of the stream (without re-reading from the stream, which
would block on sockets, etc). So it can't find the end of the line and
return false.
The next call to stream_get_line() will mark the stream as EOF, and
stream_get_line will return the line:
<?php
$fp = tmpfile();
fwrite($fp, '12345');
fseek($fp, 0);
while (!feof($fp)) {
$line = stream_get_line($fp);
if ($line === false) continue;
var_dump($line);
}
?>
Result:
string(5) "12345"
------------------------------------------------------------------------
[2009-05-29 08:39:03] lbarnaud@php.net
Please try using this CVS snapshot:
http://snaps.php.net/php5.3-latest.tar.gz
For Windows:
http://windows.php.net/snapshots/
------------------------------------------------------------------------
[2009-05-28 22:21:09] ryan dot brothers at gmail dot com
Description:
------------
When you pass to stream_get_line() a $length that is greater than the
file size and a $ending that does not appear in the file,
stream_get_line() returns bool(false) rather than the string that is in
your file.
In the below example, when I run stream_get_line() passing in a $length
of 6 and a $ending of "\n", stream_get_line() returns false rather than
the contents of the file.
The manual states "Reading ends when length bytes have been read, when
the string specified by ending is found (which is not included in the
return value), or on EOF (whichever comes first).", so I believe the
contents of my file should be returned since EOF is first to be reached.
Reproduce code:
---------------
<?php
$fp = tmpfile();
fwrite($fp, '12345');
fseek($fp, 0);
var_dump(stream_get_line($fp, 5));
fseek($fp, 0);
var_dump(stream_get_line($fp, 6));
fseek($fp, 0);
var_dump(stream_get_line($fp, 5, "\n"));
fseek($fp, 0);
var_dump(stream_get_line($fp, 6, "\n"));
fclose($fp);
Expected result:
----------------
string(5) "12345"
string(5) "12345"
string(5) "12345"
string(5) "12345"
Actual result:
--------------
string(5) "12345"
string(5) "12345"
string(5) "12345"
bool(false)
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=48420&edit=1