fscanf

(PHP 4 >= 4.0.1, PHP 5)

fscanf — Обрабатывает данные из файла в соответствии с форматом

Описание

mixed fscanf ( resource $handle , string $format [, mixed &$... ] )

Функция fscanf() похожа на sscanf(), но берёт данные для обработки из файла, ассоциируемого с handle , и интерпретирует их согласно формату format , который описан в документации функции sprintf(). Если в функцию переданы только два аргумента, обработанные значения будут возвращены в виде массива. В ином случае, если были переданы необязательные аргументы, функция вернёт количество присвоенных значений. Необязательные аргументы должны быть переданы по ссылке.

Любое пустое пространство в строке формата эквивалентно любому пустому пространству во входящем потоке. Это означает, что даже табуляция \t в строке формата может быть сопоставлена одному символу пробела во входящем потоке данных.

Пример #1 Пример использования функции fscanf()

<?php
$handle 
fopen("users.txt""r");
while (
$userinfo fscanf($handle"%s\t%s\t%s\n")) {
    list (
$name$profession$countrycode) = $userinfo;
    
//... совершаем какие-либо действия над значениями
}
fclose($handle);
?>

Пример #2 Содержимое файла users.txt

javier  argonaut        pe
hiroshi sculptor        jp
robert  slacker us
luigi   florist it

Замечание: В версиях PHP ниже 4.3.0, максимальное количество символов, которые считывались из файла, составляло 512 (или до первого символа \n - смотря что встретится первым). Начиная с версии PHP 4.3.0, длинна строк не ограничена.

См. также описание функций fread(), fgets(), fgetss(), sscanf(), printf() и sprintf().

Коментарии

For C/C++ programmers.

fscanf() does not work like C/C++, because PHP's fscanf() move file pointer the next line implicitly.
2001-03-13 01:59:52
http://php5.kiev.ua/manual/ru/function.fscanf.html
fscanf works a little retardedly I've found. Instead of using just a plain %s you probably will need to use sets instead. Because it works so screwy compared to C/C++, fscanf does not have the ability to scan ahead in a string and pattern match correctly, so a seemingly perfect function call like:

fscanf($fh, "%s::%s");

With a file like:

user::password

Will not work. When fscanf looks for a string, it will look and stop at nothing except for a whitespace so :: and everything except whitespace is considered part of that string, however you can make it a little smarter by:

fscanf($fh, "%[a-zA-Z0-9,. ]::%[a-zA-Z0-9,. ]" $var1, $var2);

Which tells it that it can only accept a through z A through Z 0 through 9 a comma a period and a whitespace as input to the string, everything else cause it to stop taking in as input and continue parsing the line. This is very useful if you want to get a sentence into the string and you're not sure of exactly how many words to add, etc.
2001-07-08 03:29:41
http://php5.kiev.ua/manual/ru/function.fscanf.html
If you want to read text files in csv format or the like(no matter what character the fields are separated with), you should use fgetcsv() instead. When a text for a field is blank, fscanf() may skip it and fill it with the next text, whereas fgetcsv() correctly regards it as a blank field.
2002-03-16 02:39:28
http://php5.kiev.ua/manual/ru/function.fscanf.html
actually, instead of trying to think of every character that might be in your file, excluding the delimiter would be much easier.

for example, if your delimiter was a comma use:

%[^,]

instead of:

%[a-zA-Z0-9.| ... ]

Just make sure to use %[^,\n] on your last entry so you don't include the newline.
2002-10-24 19:08:36
http://php5.kiev.ua/manual/ru/function.fscanf.html
Yet another function to read a file and return a record/string by a delimiter.  It is very much like fgets() with the delimiter being an additional parameter.  Works great across multiple lines.

function fgetd(&$rFile, $sDelim, $iBuffer=1024) {
    $sRecord = '';
    while(!feof($rFile)) {
        $iPos = strpos($sRecord, $sDelim);
        if ($iPos === false) {
            $sRecord .= fread($rFile, $iBuffer);
        } else {
            fseek($rFile, 0-strlen($sRecord)+$iPos+strlen($sDelim), SEEK_CUR);
            return substr($sRecord, 0, $iPos);
        }
    }
    return false;
}
2005-07-14 12:33:15
http://php5.kiev.ua/manual/ru/function.fscanf.html
to include all type of visible chars you should try:

<?php fscanf($file_handler,"%[ -~]"); ?>
2006-07-24 03:46:33
http://php5.kiev.ua/manual/ru/function.fscanf.html
It would be great to precise in the fscanf documentation
that one call to the function, reads a complete line.
and not just the number of values defined in the format.

If a text file contains 2 lines each containing 4 integer values,
reading the file with 8 fscanf($fd,"%d",$v) doesnt run !
You have to make 2 
fscanf($fd,"%d %d %d %d",$v1,$v2,$v3,$v4);

Then 1 fscanf per line.
2007-05-30 03:48:31
http://php5.kiev.ua/manual/ru/function.fscanf.html
If you want fscanf()to scan one variable in a large number of lines,  e.g an Ipadress in a line with more variables, then use fscanf with explode()
<?
$filename 
"somefile.txt";
$fp fopen($filename"r") or die ("Error opening file! \n");
$u explode(" ",$line); // $u is the variable eg. an IPadress
while ($line fscanf($fp,"%s",$u)) {
if(
preg_match("/^$u/",$_SERVER['REMOTE_ADDR'])) {$badipadresss++;} // do something and continue scan
}
?>
Besides, fscanf()is much faster than fgets()
2007-09-30 05:56:04
http://php5.kiev.ua/manual/ru/function.fscanf.html
If you want to parse a cron file, you may use this pattern:

<?php

while ($cron fscanf($fp"%s %s %s %s %s %[^\n]s"))
{

}

?>
2013-08-29 00:25:01
http://php5.kiev.ua/manual/ru/function.fscanf.html
The use of PHP code in the ACM submission
Here is a sample solution for problem 1001 using PHP:
<?php
while (fscanf(STDIN"%d%d"$a$b) == 2) {
    print (
$a $b) . "\n";
}
2015-04-13 08:19:56
http://php5.kiev.ua/manual/ru/function.fscanf.html

    Поддержать сайт на родительском проекте КГБ