Bug #68481 [Com]: feof true on php://temp one byte early
Edit report at https://bugs.php.net/bug.php?id=68481&edit=1
ID: 68481
Comment by: yvan dot burrie at hotmail dot com
Reported by: tim_siebels_aurich at yahoo dot de
Summary: feof true on php://temp one byte early
Status: Open
Type: Bug
Package: Streams related
Operating System: Tested on Ubuntu
PHP Version: 5.6.3
Block user comment: N
Private report: N
New Comment:
Wait!!! This is not a bug! PHP imitates C++ feof() function from the STDIO library.
Read this: http://stackoverflow.com/questions/5431941/while-feof-file-is-always-wrong
Previous Comments:
------------------------------------------------------------------------
[2015-01-03 12:48:18] yvan dot burrie at hotmail dot com
<?php
// yep, it's a bug!!!
$f = tmpfile();
fwrite($f, 'crap' ); // 4 bytes
rewind($f);
$i=1;
while( !feof($f) )
{
fread($f,1);
echo "$i\n";
$i++;
}
/*
outputs:
1
2
3
4
5
why the hell 5 bytes? should normally output 4 bytes:
1
2
3
4
*/
?>
------------------------------------------------------------------------
[2014-12-15 17:27:23] php at mcq8 dot be
I recently changed it for memory https://github.com/php/php-src/pull/936.
It would be better if all the streams behave the same way.
------------------------------------------------------------------------
[2014-12-13 18:18:40] sjaillet at gmail dot com
Maybe relevant, PHP & HHVM behave differently on feof().
When length bytes are read, feof() returns true on PHP while
HHVM still returns false. See code below:
```php
$stream = fopen('php://temp', 'r+');
fwrite($stream, "HelloWorld");
rewind($stream);
$result = fread($stream, 10);
echo $result . "\n"; // HelloWorld
var_dump(feof($stream)); // with PHP: true, with HHVM: false
```
They both returns false after reading length + 1 bytes.
Would be great to have something consistent.
------------------------------------------------------------------------
[2014-12-13 18:07:30] tim_siebels_aurich at yahoo dot de
The test script is not correct obviously. The first fopen is supposed to open the file created in
the preceding line.
------------------------------------------------------------------------
[2014-11-22 23:14:35] tim_siebels_aurich at yahoo dot de
Description:
------------
To get feof return true you need to read length+1 bytes you wrote. Or in
general it returns true after you tried to read beyond the last byte.
the php://temp (and php://memory too) stream however returns true after
length bytes read.
Test script:
---------------
<?php
// Test File Stream
$file = tempnam('/tmp', 'feoftest');
$h = fopen("php://temp", 'r+');
fwrite($h, "bug");
fseek($h, 0);
fread($h, 3);
var_dump(feof($h));
// Test Temp Stream
$h = fopen("php://temp", 'r+');
fwrite($h, "bug");
fseek($h, 0);
fread($h, 3);
var_dump(feof($h));
Expected result:
----------------
bool(false)
bool(false)
Actual result:
--------------
bool(false)
bool(true)
------------------------------------------------------------------------
--
Edit this bug report at https://bugs.php.net/bug.php?id=68481&edit=1
Thread (9 messages)