SplFileObject::fgets
(PHP 5 >= 5.1.0, PHP 7, PHP 8)
SplFileObject::fgets — ファイルから 1 行取り出す
パラメータ
この関数にはパラメータはありません。
戻り値
ファイルから次の行を含む文字列を返します。
エラー / 例外
ファイルが読み込みできない場合 RuntimeException がスローされます。
例
例1 SplFileObject::fgets() の例
この例では file.txt
の内容が 1 行ごとに出力されます。
<?php
$file = new SplFileObject("file.txt");
while (!$file->eof()) {
echo $file->fgets();
}
?>
参考
- fgets() - ファイルポインタから 1 行取得する
- SplFileObject::fgetss() - ファイルから 1 行取り出し HTML タグを取り除く
- SplFileObject::fgetc() - ファイルから文字を取り出す
- SplFileObject::current() - ファイルの現在の行を取得する
+add a note
User Contributed Notes 3 notes
Lucas Bustamante ¶
3 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"
}
]
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.
Lucas Bustamante ¶
3 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"
}
]
↑ and ↓ to navigate •
Enter to select •
Esc to close
Press Enter without
selection to search using Google