|
 |
fgets (PHP 3, PHP 4, PHP 5) fgets -- Читает строку из файла Описаниеstring fgets ( resource handle [, int length] )
Возвращает строку размером в length - 1 байт, прочитанную
из дескриптора файла, на который указывает параметр handle.
Чтение заканчивается, когда количество прочитанных байтов достигает
length - 1, по достижении конца строки
(который включается в возвращаемое значение) или по достижении конца файла
(что бы ни встретилось первым). Если длина не указана, по умолчанию ее
значение равно 1 килобайту или 1024 байтам.
В случае возникновения ошибки функция возвращает FALSE.
Наиболее распространенные ошибки:
Программисты, привыкшие к семантике 'C' функции fgets(),
должны принимать во внимание разницу в том, каким образом возвращается
признак достижения конца файла (EOF).
Указатель на файл должен быть корректным и указывать
на файл, успешно открытый функциями fopen() или
fsockopen().
Ниже приведен простой пример:
Пример 1. Построчное чтение файла
<?php
$handle = fopen("/tmp/inputfile.txt", "r");
while (!feof($handle)) {
$buffer = fgets($handle, 4096);
echo $buffer;
}
fclose($handle);
?>
|
|
Замечание:
Параметр length стал необязательным, начиная
с PHP версии 4.2.0. Если этот параметр опущен, длина строки принимается
за 1024. С версии PHP 4.3, отсутствие параметра length
будет приводить к чтению потока до конца строки. Если длина большинства строк
в файле превышает 8 килобайт, наиболее эффективным решением в отношении
ресурсов, используемых скриптом, будет указание максимальной длины строки.
Замечание:
Данная функция может корректно обрабатывать двоичные данные, начиная
с версии PHP 4.3. Более ранние версии не обладали этой функциональностью.
Замечание: Если у вас возникают проблемы
с распознаванием PHP окончания строк при чтении
файлов на Macintosh-совместимом компьютере или при чтении файлов, созданных
на Macintosh-совместимом компьютере, необходимо включить опцию
auto_detect_line_endings.
См. также fread(),
fgetc(),
stream_get_line(),
fopen(),
popen(),
fsockopen() и
stream_set_timeout().
fgets
svayn at yahoo dot com
14-Jul-2006 02:21
fgets is SLOW for scanning through large files. If you don't have PHP 5, use fscanf($file, "%s\n") instead.
sam dot bryan at montal dot com
23-May-2006 02:09
An easy way to authenticate Windows Domain users from scripts running on a non-Windows or non-Domain box - pass the submitted username and password to an IMAP service on a Windows machine.
<?php
$server = 'imapserver';
$user = 'user';
$pass = 'pass';
if (authIMAP($user, $pass, $server)) {
echo "yay";
} else {
echo "nay";
}
function authIMAP($user, $pass, $server) {
$connection = fsockopen($server, 143, $errno, $errstr, 30);
if(!$connection) return false;
$output = fgets($connection, 128); fputs($connection, "1 login $user $pass\r\n");
$output = fgets($connection, 128);
fputs($connection, "2 logout\r\n");
fclose($connection);
if (substr($output, 0, 4) == '1 OK') return true;
return false;
}
?>
24-Mar-2006 09:36
Macintosh line endings mentioned in docs refer to Mac OS Classic. You don't need this setting for interoperability with unixish OS X.
tavernadelleidee[italy]
09-Mar-2006 03:44
I think that the quickest way of read a (long) file with the rows in reverse order is
<?php
$myfile = 'myfile.txt';
$command = "tac $myfile > /tmp/myfilereversed.txt";
passthru($command);
$ic = 0;
$ic_max = 100; $handle = fopen("/tmp/myfilereversed.txt", "r");
while (!feof($handle) && ++$ic<=$ic_max) {
$buffer = fgets($handle, 4096);
echo $buffer."<br>";
}
fclose($handle);
?>
It echos the rows while it is reading the file so it is good for long files like logs.
Borgonovo
ecvej
04-Jan-2006 01:20
I would have expected the same behaviour from these bits of code:-
<?php
while (!feof($fp)) {
echo fgets($fp);
}
while ($line=fgets($fp)) {
echo $line;
}
stream_set_timeout($fp, 180);
while ($line=fgets($fp)) {
echo $line;
}
?>
hackajar <matt> yahoo <trot> com
05-Dec-2005 12:17
When working with VERY large files, php tends to fall over sideways and die.
Here is a neat way to pull chunks out of a file very fast and won't stop in mid line, but rater at end of last known line. It pulled a 30+ million line 900meg file through in ~ 24 seconds.
NOTE:
$buf just hold current chunk of data to work with. If you try "$buf .=" (note 'dot' in from of '=') to append $buff, script will come to grinding crawl around 100megs of data, so work with current data then move on!
//File to be opened
$file = "huge.file";
//Open file (DON'T USE a+ pointer will be wrong!)
$fp = fopen($file, 'r');
//Read 16meg chunks
$read = 16777216;
//\n Marker
$part = 0;
while(!feof($fp)) {
$rbuf = fread($fp, $read);
for($i=$read;$i > 0 || $n == chr(10);$i--) {
$n=substr($rbuf, $i, 1);
if($n == chr(10))break;
//If we are at the end of the file, just grab the rest and stop loop
elseif(feof($fp)) {
$i = $read;
$buf = substr($rbuf, 0, $i+1);
break;
}
}
//This is the buffer we want to do stuff with, maybe thow to a function?
$buf = substr($rbuf, 0, $i+1);
//Point marker back to last \n point
$part = ftell($fp)-($read-($i+1));
fseek($fp, $part);
}
fclose($fp);
kpeters AT-AT monolithss DEE OH TEE com
01-Dec-2005 05:51
It appears that fgets() will return FALSE on EOF (before feof has a chance to read it), so this code will throw an exception:
while (!feof($fh)) {
$line = fgets($fh);
if ($line === false) {
throw new Exception("File read error");
}
}
dandrews OVER AT 3dohio DOT com
07-Jan-2005 11:11
Saku's example may also be used like this:
<?php
@ $pointer = fopen("$DOCUMENT_ROOT/foo.txt", "r"); if ($pointer) {
while (!feof($pointer)) {
$preTEXT = fgets($pointer, 999);
$ATEXT[$I] = $preTEXT; $I++;
}
fclose($pointer);
}
?>
angelo [at] mandato <dot> com
19-Nov-2004 06:43
Sometimes the strings you want to read from a file are not separated by an end of line character. the C style getline() function solves this. Here is my version:
<?php
function getline( $fp, $delim )
{
$result = "";
while( !feof( $fp ) )
{
$tmp = fgetc( $fp );
if( $tmp == $delim )
return $result;
$result .= $tmp;
}
return $result;
}
$fp = fopen("/path/to/file.ext", 'r');
while( !feof($fp) )
{
$str = getline($fp, '|');
}
fclose($fp);
?>
lelkesa
04-Nov-2004 02:54
Note that - afaik - fgets reads a line until it reaches a line feed (\\n). Carriage returns (\\r) aren't processed as line endings.
However, nl2br insterts a <br /> tag before carriage returns as well.
This is useful (but not nice - I must admit) when you want to store a more lines in one.
<?php
function write_lines($text) {
$file = fopen('data.txt', 'a');
fwrite($file, str_replace("\n", ' ', $text)."\n");
fclose($file);
}
function read_all() {
$file = fopen('data.txt', 'r');
while (!feof($file)) {
$line = fgets($file);
echo '<u>Section</u><p>nl2br'.($line).'</p>';
}
fclose($file);
}
?>
Try it.
05-Sep-2004 03:05
If you need to simulate an un-buffered fgets so that stdin doesnt hang there waiting for some input (i.e. it reads only if there is data available) use this :
<?php
function fgets_u($pStdn) {
$pArr = array($pStdn);
if (false === ($num_changed_streams = stream_select($pArr, $write = NULL, $except = NULL, 0))) {
print("\$ 001 Socket Error : UNABLE TO WATCH STDIN.\n");
return FALSE;
} elseif ($num_changed_streams > 0) {
return trim(fgets($pStdn, 1024));
}
}
?>
rstefanowski at wi dot ps dot pl
12-Aug-2004 09:03
Take note that fgets() reads 'whole lines'. This means that if a file pointer is in the middle of the line (eg. after fscanf()), fgets() will read the following line, not the remaining part of the currnet line. You could expect it would read until the end of the current line, but it doesn't. It skips to the next full line.
timr
16-Jun-2004 07:13
If you need to read an entire file into a string, use file_get_contents(). fgets() is most useful when you need to process the lines of a file separately.
Saku
04-Jun-2004 05:47
As a beginner I would have liked to see "how to read a file into a string for use later and not only how to directly echo the fgets() result. This is what I derived:
<?php
@ $pointer = fopen("$DOCUMENT_ROOT/foo.txt", "r"); if ($pointer) {
while (!feof($pointer)) {
$preTEXT = fgets($pointer, 999);
$TEXT = $TEXT . $preTEXT;
}
fclose($pointer);
}
?>
flame
21-May-2004 08:44
fread is binary safe, if you are stuck with a pre 4.3 version of PHP.
Pete
22-Feb-2004 04:35
If you have troubles reading binary data with versions <= 4.3.2 then upgrade to 4.3.3
The binary safe implementation seems to have had bugs which were fixed in 4.3.3
| |