|
|
 |
fseek (PHP 3, PHP 4, PHP 5) fseek -- Seeks on a file pointer Descriptionint fseek ( resource handle, int offset [, int whence] )
Sets the file position indicator for the file referenced by
handle. The new position, measured in bytes
from the beginning of the file, is obtained by adding
offset to the position specified by
whence, whose values are defined as
follows:
| SEEK_SET - Set position equal to offset bytes. | | SEEK_CUR - Set position to current location plus offset. | | SEEK_END - Set position to end-of-file plus offset.
(To move to a position before the end-of-file, you need to pass a negative
value in offset.) |
If whence is not specified, it is assumed to be
SEEK_SET.
Upon success, returns 0; otherwise, returns -1. Note that seeking
past EOF is not considered an error.
Example 1. fseek() example |
<?php
$fp = fopen('somefile.txt');
$data = fgets($fp, 4096);
fseek($fp, 0);
?>
|
|
May not be used on file pointers returned by
fopen() if they use the "http://" or "ftp://"
formats. fseek() gives also undefined results for
append-only streams (opened with "a" flag).
Note:
The whence argument was added after PHP 4.0.0.
Note:
If you have opened the file in append ("a" or "a+") mode, any data you write
to the file will always be appended, regardless of the file position.
See also ftell() and
rewind().
User Contributed Notes
fseek
alan at peaceconstitution.com
17-May-2005 08:03
Thanks to Dan, whose above comment provided a key to solve the issue of how to append to a file.
After, using phpinfo(); I made sure my installation of PHP had the requisite settings mentioned in the text to the manual entry for fopen(), I was puzzled as to why my use of fopen() with the append option 'a' (append option) didn't work. Then I read a comment contributed to Appendix L (http://us2.php.net/manual/en/wrappers.php) that the append option 'a' for fopen() doesn't work as expected. The writer suggested using the 'w' option instead, which I found did work. But the 'w' option (write option) overwrites everything in the file.
The question remained how to accomplish appending. Following Dan's suggestion about the 'r+' option, I tried this, which works fine:
$string = "Message to write to log";
$filehandle = fopen ("/home/name/sqllogs/phpsqlerr.txt", 'r+');
fseek ( $filehandle,0, SEEK_END);
fwrite ( $filehandle, $string."\n" );
fclose ($filehandle);
Lutz ( l_broedel at gmx dot net )
14-Feb-2005 04:25
Based on the function below, provided by info at o08 dot com (thanks), the following should enable you to read a single line from a file, identified by the line number (starting with 1):
<?
function readLine ($linenum,$fh) {
$line = fgets ($fh, 4096);
$pos = -1;
$i = 0;
while (!feof($fh) && $i<($linenum-1)) {
$char = fgetc($fh);
if ($char != "\n" && $char != "\r") {
fseek($fh, $pos, SEEK_SET);
$pos ++;
}
else $i ++;
}
$line = fgets($fh);
return $line;
} ?>
info at o08 dot com
15-Feb-2004 01:27
I think the function should be as following to deal any combination of cr & lf, no matter the line ends by cr, lf, cr-lf or lf-cr:
<?php
function getline ($handle) {
while (!feof($handle)) {
$char = fgetc($handle);
if (($char == "\n") or ($char == "\r")) {
$char2 = fgetc($handle);
if (($char2 != "\n") && ($char2 != "\r")) {
fseek ($handle,-1,SEEK_CUR);
}
break;
}
else {
$buffer .= $char;
}
}
return $buffer;
}
?>
jim at lfchosting dot com
04-Nov-2003 08:03
Here is a function that returns the last line of a file. This should be quicker than reading the whole file till you get to the last line. If you want to speed it up a bit, you can set the $pos = some number that is just greater than the line length. The files I was dealing with were various lengths, so this worked for me.
<?php
function readlastline($file)
{
$fp = @fopen($file, "r");
$pos = -1;
$t = " ";
while ($t != "\n") {
fseek($fp, $pos, SEEK_END);
$t = fgetc($fp);
$pos = $pos - 1;
}
$t = fgets($fp);
fclose($fp);
return $t;
}
?>
aspyrine at hotmail dot com
11-Mar-2003 09:51
If you want to go to the end of a socket stream with fseek() you'll get the following error :
"stream does not support seeking"
feof() wont work eiver in a stream (ie. smtp)
You can move the pointer to the end with this command :
while(fgetc($fp)) {}
...so easy :-)
16-Sep-2002 03:25
Don't use filesize() on files that may be accessed and updated by parallel processes or threads (as the filesize() return value is maintained in a cache).
Instead lock the opened file and use fseek($fp,0,SEEK_END) and ftell($fp) to get the actual filesize if you need to perform a fread() call to read the whole file...
24-Aug-2002 07:12
The following call moves to the end of file (i.e. just after the last byte of the file):
fseek($fp, 0, SEEK_END);
It can be used to tell the size of an opened file when the file name is unknown and can't be used with the filesize() function:
fseek($fp, 0, SEEK_END);
$filesize = ftell($fp);
The following call moves to the begining of file:
fseek($fp, 0, SEEK_SET);
It is equivalent to:
rewind($fp);
dan at daniellampert dot com
01-Jan-2002 04:54
For all first-time users of the fseek() function, remember these three things:
1. to use a programming expression, fseek() is "base 0", so to prepare the file for writing at character 1, you'd say fseek($fp,0); and to prepare the file for writing at character $num, you'd say fseek($fp,($num-1));
2. here's the formula for accessing fixed-length records in a file (you need to seek the position of the end of the previous record):
/* assumes the desired record number is in $rec_num */
/* assumes the record length is in $rec_len */
$pos = ( ($rec_num-1) * $rec_len );
fseek($fp,$pos);
3. if you're using fseek() to write data to a file, remember to open the file in "r+" mode, example:
$fp=fopen($filename,"r+");
Don't open the file in mode "a" (for append), because it puts the file pointer at the end of the file and doesn't let you fseek earlier positions in the file (it didn't for me!). Also, don't open the file in mode "w" -- although this puts you at the beginning of the file -- because it wipes out all data in the file.
Hope this helps.
| |