For C/C++ programmers.
fscanf() does not work like C/C++, because PHP's fscanf() move file pointer the next line implicitly.
(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)
fscanf — Обрабатывает данные из файла по условиям формата
Функция fscanf() аналогична функции
sscanf(), но берёт входные данные из файла,
который связан с потоком stream
, и интерпретирует входные данные
по условиям формата format
.
Любой пробельный символ в строке формата эквивалентен любому
пробельному символу во входящем потоке. Это означает, что даже символ табуляции
(\t
) в строке формата может соответствовать
одному символу пробела в потоке входных данных.
Каждый вызов функции fscanf() считывает одну строку из файла.
stream
Ресурс (resource) указателя файловой системы, который обычно создают функцией fopen().
format
Формат интерпретации строки string
,
который описывает документация к функции sprintf()
со следующими отличиями:
F
, g
, G
и b
.
D
обозначает десятичное число.
i
обозначает целое число с определением системы счисления.
n
обозначает количество символов, которые функция уже обработала.
s
останавливает чтение при любом пробельном символе.
*
вместо спецификатора преобразования argnum$
подавляет
присваивание этого спецификатора преобразования.
vars
Необязательные переменные, которым функция присвоит значения.
Функция возвращает массив с результатами разбора, если в функцию передали только два аргумента. Функция вернёт количество присвоенных значений, если передали необязательные аргументы. Необязательные аргументы требуется передавать по ссылке.
Если параметр format
ожидает больше подстрок,
чем доступно в параметре string
, вернётся значение null
.
Функци вернёт false
, если возникнут другие ошибки.
Пример #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
For C/C++ programmers.
fscanf() does not work like C/C++, because PHP's fscanf() move file pointer the next line implicitly.
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.
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.
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;
}
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"))
{
}
?>
to include all type of visible chars you should try:
<?php fscanf($file_handler,"%[ -~]"); ?>
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.