phpday 2022

SplFileObject::fgets

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::fgetsRécupère une ligne d'un fichier

Description

public SplFileObject::fgets(): string

Récupère une ligne d'un fichier.

Liste de paramètres

Cette fonction ne contient aucun paramètre.

Valeurs de retour

Retourne une chaîne de caractères contenant la prochaine ligne d'un fichier, ou false si une erreur survient.

Erreurs / Exceptions

Lance une exception RuntimeException si le fichier ne peut être lu.

Exemples

Exemple #1 Exemple avec SplFileObject::fgets()

Cet exemple affiche seulement le contenu du fichier file.txt ligne par ligne.

<?php
$file 
= new SplFileObject("file.txt");
while (!
$file->eof()) {
    echo 
$file->fgets();
}
?>

Voir aussi

add a note add a note

User Contributed Notes 3 notes

up
4
Chris Johnson
4 years ago
Note that this method will cause a PHP fatal error if the file being read contains no recognizable line termination characters and is larger than the allowable memory size for PHP to allocate, i.e. memory_limit set in php.ini or similar.  In other words, PHP keeps reading until it finds a line termination, if it runs out of memory first, it will throw a fatal error.

This is different from the file resource fread() function, which allows an optional maximum length argument to be passed to limit this behavior.
up
1
Lucas Bustamante
3 months ago
I forgot to mention in my previous note about PHP PHP 8.0.10, that you can use $file->current(); $file->next(); as a replacement for $file->fgets(); that works consistently from PHP 5.1 to 8.0.1+ after a seek():

<?php

$file
= new SplTempFileObject();

for (
$i = 0; $i < 100; $i++) {
   
$file->fwrite("Foo $i\n");
}

$file->seek(50);

print_r(array(
    array(
'line' => $file->key(), 'contents' => trim($file->current()), 'triggerNext' => $file->next()),
    array(
'line' => $file->key(), 'contents' => trim($file->current()), 'triggerNext' => $file->next()),
    array(
'line' => $file->key(), 'contents' => trim($file->current()), 'triggerNext' => $file->next()),
));

?>

PHP 5.1 to 8.0.1+:

[
    {
        "line": 50,
        "contents": "Foo 50"
    },
    {
        "line": 51,
        "contents": "Foo 51"
    },
    {
        "line": 52,
        "contents": "Foo 52"
    }
]
up
1
Lucas Bustamante
3 months ago
Notice that the behavior of fgets after a seek changed on PHP 8.0.10, if you seek to line 50 and run fgets, it will give you line 50, while on PHP 5.1~8.0.0 it would give you line 51:

<?php

$file
= new SplTempFileObject();

for (
$i = 0; $i < 100; $i++) {
   
$file->fwrite("Foo $i\n");
}

$file->seek(50);

echo
json_encode(array(
    array(
'line' => $file->key(), 'contents' => trim($file->fgets())),
    array(
'line' => $file->key(), 'contents' => trim($file->fgets())),
    array(
'line' => $file->key(), 'contents' => trim($file->fgets())),
),
JSON_PRETTY_PRINT);

?>

Results:

PHP  8.0.1+
[
    {
        "line": 50,
        "contents": "Foo 50"
    },
    {
        "line": 50,
        "contents": "Foo 51"
    },
    {
        "line": 51,
        "contents": "Foo 52"
    }
]

PHP 5.1 to 8.0.0
[
    {
        "line": 50,
        "contents": "Foo 51"
    },
    {
        "line": 51,
        "contents": "Foo 52"
    },
    {
        "line": 52,
        "contents": "Foo 53"
    }
]
To Top