ID: 48420 User updated by: ryan dot brothers at gmail dot com Reported By: ryan dot brothers at gmail dot com -Status: Feedback +Status: Open Bug Type: Streams related Operating System: Linux PHP Version: 5.*, 6CVS(2009-05-29) New Comment:
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) Previous Comments: ------------------------------------------------------------------------ [2009-05-29 09:00:45] lbarn...@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] lbarn...@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