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 — Interpreta a leitura de um arquivo de acordo com um formato
A função fscanf() é semelhante à
sscanf(), mas usa como entrada um arquivo
associado com o fluxo stream
e interpreta a
entrada de acordo com o especificado em format
.
Qualquer espaço em branco na string do formato corresponde a quaisquer espaços em branco
no fluxo de entrada. Isto significa que até mesmo uma tabulação (\t
) na
string do formato pode corresponder a um único caractere de espaço no fluxo de entrada.
Cada chamada a fscanf() lê uma linha do arquivo.
stream
Um resource de ponteiro do sistema de arquivos que normalmente é criado usando fopen().
format
O formato interpretado para string
, que é
descrito na documentação para sprintf() com
as seguintes diferenças:
F
, g
, G
e
b
não são suportados.
D
significa número decimal.
i
significa inteiro com detecção de base.
n
representa o número de caracteres processados até o momento.
s
pára de ler em qualquer caractere de espaço em branco.
*
em vez de argnum$
suprime
a atribuição desta especificação de conversão.
vars
Os valores opcionais atribuídos.
Se somente dois parâmetros forem passados a esta função, os valores interpretados serão retornados como um array. Do contrário, se parâmetros opcionais forem passados, a função retornará o número de valores atribuídos. Os parâmetros opcionais devem ser passados por referência.
Se houver mais substrings esperadas no parâmetro format
do que estiverem disponíveis na string
,
null
será retornado. Para outros erros, false
será retornado.
Exemplo #1 Exemplo de fscanf()
<?php
$handle = fopen("users.txt", "r");
while ($userinfo = fscanf($handle, "%s\t%s\t%s\n")) {
list ($name, $profession, $countrycode) = $userinfo;
//... faz algo com os valores
}
fclose($handle);
?>
Exemplo #2 Conteúdo de 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.