|
feof
Tests for end-of-file on a file pointer
(PHP 4, PHP 5)
Example 625. feof() example with an invalid file pointer<?php Related Examples ( Source code ) » feof Examples ( Source code ) » fgetss Gets line from file pointer and strip HTML tags Examples ( Source code ) » SAX parser in action Examples ( Source code ) » A simple XML parser Examples ( Source code ) » Turning an XML Document into an Array Examples ( Source code ) » Generating Tables from XML Examples ( Source code ) » Transforming XML into Basic HTML Examples ( Source code ) » Close a file after reading Examples ( Source code ) » Using fgets() and feof() Functions Examples ( Source code ) » Opening and Reading a File Line by Line Examples ( Source code ) » Reading a File with fread() Examples ( Source code ) » File read by char Examples ( Source code ) » Read in and perform operations on a file line by line Examples ( Source code ) » Using popen() to Read the Output of the UNIX who Command Examples ( Source code ) » Open socket and read Examples ( Source code ) » Getting and Printing a Web Page with fopen() Code Examples / Notes » feofm 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 Languagebasename 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 |