Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : Filesystem Functions : feof

feof

Tests for end-of-file on a file pointer (PHP 4, PHP 5)
bool feof ( resource handle )

Tests for end-of-file on a file pointer.

Parameters

handle

The file pointer must be valid, and must point to a file successfully opened by fopen() or fsockopen() (and not yet closed by fclose()).

Return Values

Returns TRUE if the file pointer is at EOF or an error occurs (including socket timeout); otherwise returns FALSE.

Notes

Warning:

If a connection opened by fsockopen() wasn't closed by the server, feof() will wait until a timeout has been reached to return TRUE. The default timeout value is 60 seconds. You may use stream_set_timeout() to change this value.

Warning:

If passed file pointer is not valid you may get an infinite loop, because EOF fails to return TRUE.

Example 625. feof() example with an invalid file pointer

<?php
// if file can not be read or doesn't exist fopen function returns FALSE
$file = @fopen("no_such_file", "r");

// FALSE from fopen will issue warning and result in infinite loop here
while (!feof($file)) {
}

fclose($file);
?>


Related Examples ( Source code ) » feof
















Code Examples / Notes » feof

m a p o p a

you  can avoid the infinite loop and filling the error logs
by an simple if statement
Here is the example
   $handle = fopen("http://xml.weather.yahoo.com/forecastrss?p=AYXX0008&u=f", "r");
   $xml = "";
   if ($handle)
   {
      while (!feof($handle))
      {
          $xml .= fread($handle, 128);
      }
       fclose($handle);
   }


jet

To avoid infinite loop with fgets() just use do..while statement.
<?php
if ($f = fopen('myfile.txt', 'r')) do {
   $line = fgets($f);
   // do any stuff here...
} while (!feof($f));
fclose($f);


04-mar-2005 05:02

if you're worried the file pointer is invalid, TEST IT before you go into your loop... that way it'll never be an infinite loop.

02-jan-2006 02:27

if you use fseek function to pos the pointer exceed the size the file,feof still return true.so note that when you use feof as the condition of while loop.

01-aug-2005 06:21

if you hit an feof() infinite loop, watch out for resultant humongous logs, they can cripple a site with hard disk usage limits or run up excess usage fees.

ironoxid

I really thought that the feof() was TRUE when the logical file pointer is a EOF.
but no !
we need to read and get an empty record before the eof() reports TRUE.
So
$fp = fopen('test.bin','rb');
while(!feof($fp)) {
 $c = fgetc($fp);
 // ... do something with $c
 echo ftell($fp), ",";
}
echo 'EOF!';
prints for two time the last byte position.
If our file length is 5 byte this code prints
0,1,2,3,4,5,5,EOF!
Because of this, you have to do another check to verify if fgetc really reads another byte (to prevent error on "do something with $c" ^_^).
To prevent errors you have to use this code
$fp = fopen('test.bin','rb');
while(!feof($fp)) {
 $c = fgetc($fp);
 if($c === false) break;
 // ... do something with $c
}
but this is the same of
$fp = fopen('test.bin','rb');
while(($c = fgetc($fp))!==false) {
 // ... do something with $c
}
Consequently feof() is simply useless.
Before write this note I want to submit this as a php bug but one php developer said that this does not imply a bug in PHP itself (http://bugs.php.net/bug.php?id=35136&edit=2).
If this is not a bug I think that this need at least to be noticed.
Sorry for my bad english.
Bye ;)


johannes

I found feof() to be a slow function when using a non-blocking connection.
The function stream_get_meta_data() returns much quicker and has a return field 'eof'.


cmr

Here's solution 3:
<?
$fp = fopen("myfile.txt", "r");
while ( ($current_line = fgets($fp)) !== false ) {
 // do stuff to the current line here
}
fclose($fp);
?>
AFAICS fgets() never returns an empty string, so we can also write:
<?
$fp = fopen("myfile.txt", "r");
while ( $current_line = fgets($fp) ) {
 // do stuff to the current line here
}
fclose($fp);
?>


tom

feof() is, in fact, reliable.  However, you have to use it carefully in conjunction with fgets().  A common (but incorrect) approach is to try something like this:
<?
$fp = fopen("myfile.txt", "r");
while (!feof($fp)) {
 $current_line = fgets($fp);
 // do stuff to the current line here
}
fclose($fp);
?>
The problem when processing plain text files is that feof() will not return true after getting the last line of input.  You need to try to get input _and fail_ before feof() returns true.  You can think of the loop above working like this:
* (merrily looping, getting lines and processing them)
* fgets used to get 2nd to last line
* line is processed
* loop back up -- feof returns false, so do the steps inside the loop
* fgets used to get last line
* line is processed
* loop back up -- since the last call to fgets worked (you got the last line), feof still returns false, so you do the steps inside the loop again
* fgets used to try to get another line (but there's nothing there!)
* your code doesn't realize this, and tries to process this non-existent line (typically by doing the same actions again)
* now when your code loops back up, feof returns true, and your loop ends
There's two ways to solve this:
1. You can put an additional test for feof() inside the loop
2. You can move around your calls to fgets() so that the testing of feof() happens in a better location
Here's solution 1:
<?
$fp = fopen("myfile.txt", "r");
while(!feof($fp)) {
 $current_line = fgets($fp);
 if (!feof($fp)) {
   // process current line
 }
}
fclose($fp);
?>
And here's solution 2 (IMHO, more elegant):
<?
$fp = fopen("myfile.txt", "r");
$current_line = fgets($fp);
while (!feof($fp)) {
 // process current line
 $current_line = fgets($fp);
}
fclose($fp);
?>
FYI, the eof() function in C++ works the exact same way, so this isn't just some weird PHP thing...


Change Language


Follow Navioo On Twitter
basename
chgrp
chmod
chown
clearstatcache
copy
delete
dirname
disk_free_space
disk_total_space
diskfreespace
fclose
feof
fflush
fgetc
fgetcsv
fgets
fgetss
file_exists
file_get_contents
file_put_contents
file
fileatime
filectime
filegroup
fileinode
filemtime
fileowner
fileperms
filesize
filetype
flock
fnmatch
fopen
fpassthru
fputcsv
fputs
fread
fscanf
fseek
fstat
ftell
ftruncate
fwrite
glob
is_dir
is_executable
is_file
is_link
is_readable
is_uploaded_file
is_writable
is_writeable
lchgrp
lchown
link
linkinfo
lstat
mkdir
move_uploaded_file
parse_ini_file
pathinfo
pclose
popen
readfile
readlink
realpath
rename
rewind
rmdir
set_file_buffer
stat
symlink
tempnam
tmpfile
touch
umask
unlink
eXTReMe Tracker