PHPerKaigi 2024

SplFileObject::fgets

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

SplFileObject::fgetsObtener la línea de el fichero

Descripción

public SplFileObject::fgets(): string

Obtener la línea de el fichero.

Parámetros

Esta función no tiene parámetros.

Valores devueltos

Devuelve un string conteniendo la siguiente línea de el fichero.

Errores/Excepciones

Lanza una RuntimeException si el fichero no puede ser leído.

Ejemplos

Ejemplo #1 Ejemplo de SplFileObject::fgets()

Este ejemplo simplemente imprime el contenido de texto.txt línea por línea.

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

Ver también

add a note

User Contributed Notes 3 notes

up
5
Lucas Bustamante
2 years 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"
}
]
up
5
Chris Johnson
6 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
4
Lucas Bustamante
2 years 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"
}
]
To Top