fscanf

fscanf($stream, $format, &...$vars)

Lit une ligne d’un fichier ouvert et l’analyse selon un format, comme sscanf(). Sans variables, elle renvoie un tableau de valeurs, avec des variables elle les remplit et renvoie leur nombre. À la fin du fichier, elle renvoie false.

Paramètres

  • $stream – un fichier ouvert par fopen().
  • $format – le format : %s (un mot jusqu’à une espace), %d (un entier), %f (un nombre décimal), %c (un caractère)…
  • $vars – variables facultatives dans lesquelles les valeurs sont enregistrées.

Exemples

$file = sys_get_temp_dir() . "/garth-example.txt";
file_put_contents($file, "Marie 35 1.5\nLucie 28 2.25\n");
$f = fopen($file, "r");
// une ligne : un tableau de valeurs aux types convertis
echo json_encode(fscanf($f, "%s %d %f")); // ["Marie",35,1.5]
// dans des variables : elle renvoie le nombre de valeurs affectées
$n = fscanf($f, "%s %d %f", $nom, $age, $points);
echo "$n: $nom, $age, $points"; // 3: Lucie, 28, 2.25
// la fin du fichier
var_dump(fscanf($f, "%s %d")); // bool(false)
fclose($f);
// une ligne vide renvoie null, une valeur qui ne correspond pas donne null dans le tableau
file_put_contents($file, "\nPierre x\n");
$f = fopen($file, "r");
var_dump(fscanf($f, "%s %d")); // NULL
echo json_encode(fscanf($f, "%s %d")); // ["Pierre",null]
fclose($f);
unlink($file);

Points d’attention

  • Chaque appel traite une ligne entière. Ce qui reste sur la ligne après le format est perdu.
  • %s ne lit que jusqu’à une espace, il coupe donc les noms de plusieurs mots. Les fichiers avec séparateurs se lisent mieux avec fgetcsv().
  • Une ligne vide renvoie null, la fin du fichier false. Une boucle while (($r = fscanf($f, …)) !== false) reçoit donc null pour une ligne vide et doit le traiter.

Fonctions associées :
sscanf()
fgets()
fgetcsv()
fopen()