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 )

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