Bug #68481 [Com]: feof true on php://temp one byte early

From: Date: Tue, 06 Jan 2015 06:11:58 +0000
Subject: Bug #68481 [Com]: feof true on php://temp one byte early
References: 1  Groups: php.bugs 
Request: Send a blank email to php-bugs+get-189675@lists.php.net to get a copy of this message
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)

« previous php.bugs (#189675) next »