Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】fgets()関数の使い方

fgets関数の使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

fgets関数は、指定されたファイルポインタから1行分のデータを読み込む処理を実行する関数です。この関数は、主にテキストファイルの内容を1行ずつ処理する際に利用されます。ファイルポインタとは、fopen()関数などで開かれたファイルへの接続を示すものであり、fgets()関数はこのポインタを通じてデータを読み込みます。

具体的には、fgets()関数は、ファイルポインタから改行コード(\n)に到達するまで、あるいは指定された最大バイト数に達するまで文字を読み込みます。読み込みが成功すると、改行コードを含んだ文字列を返します。例えば、ログファイルや設定ファイルなど、行単位で情報を区切っているテキストファイルの内容をPHPプログラムで解析する際に非常に役立ちます。

引数としては、読み込み対象となるファイルポインタを最初に指定します。オプションで第二引数に読み込む最大バイト数を指定できます。このバイト数を指定することで、意図しない大きなデータブロックの読み込みを防ぎ、メモリ使用量を制御することが可能です。この最大バイト数が指定された場合、実際には指定値から1を引いたバイト数までが読み込まれ、残りの1バイトは文字列の終端を示すnull文字のために予約されます。

戻り値は、読み込みが成功した場合は文字列として返されますが、ファイルの終端(EOF)に達した場合や、何らかのエラーが発生した場合はfalseを返します。そのため、通常は戻り値がfalseでないことを確認しながら、whileループなどを用いてファイル全体を読み進めるように使用されます。fgets()関数は、ファイルからの行単位のデータ取得を安全かつ効率的に行うための、PHPにおける基本的なファイル操作関数の一つです。

構文(syntax)

1<?php
2$fileHandle = fopen('php://stdin', 'r');
3$line = fgets($fileHandle);
4fclose($fileHandle);
5?>

引数(parameters)

resource $stream, ?int $length = null

  • resource $stream: 読み込む対象となるファイルポインタやソケットなどのリソースを指定します
  • ?int $length = null: 読み込む最大バイト数を指定します。省略した場合、1行全体を読み込みます

戻り値(return)

string|false

指定されたファイルポインタから1行を読み込み、文字列として返します。ファイルの終端に達するか、エラーが発生した場合は false を返します。

サンプルコード

php fgets(STDIN)で標準入力から1行読み込む

1<?php
2
3// 標準入力から1行読み込むサンプルコード
4$line = fgets(STDIN);
5
6// 読み込んだ内容を出力
7if ($line !== false) {
8    echo "入力された内容: " . $line;
9} else {
10    echo "入力がありませんでした。\n";
11}
12
13?>

PHPのfgets関数は、指定されたストリームから1行読み込むために使用されます。このサンプルコードでは、標準入力(STDIN)から1行読み込んでいます。fgets(STDIN)は、ユーザーが入力したテキストを改行文字(\n)まで読み込み、文字列として返します。

引数$streamには、読み込むストリームのリソースを指定します。ここでは、標準入力STDINを指定することで、キーボードからの入力を読み込むように設定しています。オプションの引数$lengthは、読み込む最大バイト数を指定できます。省略した場合は、改行文字に達するまで、またはストリームの終端まで読み込みます。

fgets関数は、読み込んだ文字列を返すか、エラーが発生した場合やストリームの終端に達した場合はfalseを返します。サンプルコードでは、戻り値がfalseでないことを確認し、読み込んだ内容を出力しています。もしfalseが返された場合は、入力がなかったことを示すメッセージを表示します。この関数を使用することで、ユーザーからの入力を簡単に処理できます。標準入力からの読み込みは、コマンドラインツールや簡単なインタラクティブなプログラムを作成する際に役立ちます。

fgets関数は、指定したストリームから1行読み込む関数です。引数には、読み込み元のストリームを指定します。標準入力から読み込む場合は、STDINを渡します。オプション引数として、読み込む最大バイト数を指定できます。

戻り値は、読み込んだ文字列、またはエラー時にfalseを返します。読み込みが成功したかどうかは、戻り値がfalseでないかで確認する必要があります。サンプルコードでは、!== 演算子を使って厳密にfalseかどうかを判定しています。

fgets関数は、改行文字(\n)を含む行全体を読み込みます。読み込んだ文字列には、改行文字が含まれる可能性があるため、必要に応じてtrim関数などで削除してください。標準入力からの読み込みでは、ユーザが何も入力せずにEnterキーを押した場合、空文字列が返されることに注意してください。

PHP fgets でファイルから一行ずつ読み込む

1<?php
2
3// ファイルから一行ずつ読み込むサンプルコード
4$filename = 'sample.txt';
5
6// ファイルが存在するか確認
7if (file_exists($filename)) {
8  // ファイルを読み込みモードで開く
9  $file = fopen($filename, 'r');
10
11  // ファイルが開けたか確認
12  if ($file) {
13    // ファイルの終端に達するまで繰り返す
14    while (($line = fgets($file)) !== false) {
15      // 改行コードを取り除く
16      $line = trim($line);
17
18      // 読み込んだ行を出力する
19      echo $line . PHP_EOL;
20    }
21
22    // ファイルを閉じる
23    fclose($file);
24  } else {
25    echo "ファイルを開けませんでした。" . PHP_EOL;
26  }
27} else {
28  echo "ファイルが存在しません。" . PHP_EOL;
29}
30
31?>

PHPのfgets関数は、ファイルポインタが指すファイルから一行読み込むための関数です。第一引数$streamには、fopen関数などで取得したファイルリソースを指定します。第二引数$lengthはオプションで、読み込む最大バイト数を指定できます。省略した場合、改行文字が現れるか、ファイルの終端に達するまで読み込みます。

サンプルコードでは、まずsample.txtというファイルが存在するかどうかを確認しています。ファイルが存在する場合、fopen関数で読み込みモードでファイルを開き、ファイルリソースを変数$fileに格納します。

次に、whileループを用いてfgets関数で一行ずつファイルを読み込みます。fgets($file)は、読み込んだ行を文字列として返します。ファイルの終端に達した場合はfalseを返します。ループを抜ける条件として、fgetsfalseを返すかどうかをチェックしています。

fgets関数は、改行コードを含んだ文字列を返すため、trim関数を用いて行頭と行末の空白文字と改行コードを取り除いています。その後、echo文で読み込んだ行を出力し、PHP_EOLで改行を挿入しています。

最後に、fclose関数でファイルを閉じます。もしファイルを開けなかった場合、またはファイルが存在しなかった場合は、エラーメッセージを出力します。このサンプルコードは、テキストファイルを一行ずつ読み込み、内容を処理する基本的な方法を示しています。

fgets関数は、ファイルから一行読み込む関数です。引数には、fopen関数などで取得したファイルポインタ($stream)を指定します。2つ目の引数($length)は省略可能で、読み込む最大バイト数を指定できます。

戻り値は、読み込んだ文字列、またはエラー時にfalseです。while文でfgetsの結果を厳密にfalseと比較しているのは、空行を読み込んだ場合に空文字列が返り、falseと評価されないようにするためです。

fgetsは改行コードを含めて読み込むため、多くの場合trim関数で改行コードを取り除く必要があります。Windows環境では改行コードが"\r\n"となるため、環境に合わせて調整してください。必ずfclose関数でファイルを閉じることが重要です。ファイルの存在チェックやfopenの成功確認も忘れずに行いましょう。

PHP fgets で複数行ファイルを読み込む

1<?php
2
3/**
4 * 指定されたファイルから複数行を読み込み、その内容を出力します。
5 *
6 * @param string $filePath 読み込むファイルのパス
7 * @return void
8 */
9function readMultipleLinesFromFile(string $filePath): void
10{
11    // ファイルを読み込みモード ('r') でオープンします。
12    // 'r' はファイルが存在しない場合はエラーとなり、読み込み専用であることを示します。
13    $fileHandle = fopen($filePath, 'r');
14
15    // ファイルのオープンに失敗した場合、エラーメッセージを表示し処理を終了します。
16    if ($fileHandle === false) {
17        echo "エラー: ファイル '{$filePath}' を開けませんでした。\n";
18        return;
19    }
20
21    echo "--- ファイル内容の読み込み開始 ---\n";
22
23    // ファイルの終端に達するまで、1行ずつデータを読み込みます。
24    // fgets() はファイルから1行を読み込み、ファイルポインタを進めます。
25    // 読み込みに成功した場合、読み込んだ文字列(改行文字を含む)を返します。
26    // ファイルの終端に達した場合や、エラーが発生した場合は false を返します。
27    while (($line = fgets($fileHandle)) !== false) {
28        // 読み込んだ行を出力します。
29        // fgets() は改行文字も読み込むため、そのまま出力することで元のファイルの形式が保持されます。
30        echo $line;
31    }
32
33    echo "--- ファイル内容の読み込み終了 ---\n";
34
35    // ファイルストリームを閉じます。
36    // ファイルを開いた後は、必ず閉じることでリソースを解放します。
37    fclose($fileHandle);
38}
39
40// スクリプトが単体で動作するための準備と実行例
41
42// 読み込み対象となる一時的なファイル名を設定します。
43$testFileName = 'example_data.txt';
44
45// テスト用のファイルに複数行のデータを書き込みます。
46// file_put_contents() は指定したファイルに文字列を書き込む便利な関数です。
47$contentToWrite = "PHPはWeb開発によく使われます。\n";
48$contentToWrite .= "fgets関数はファイルから1行ずつ読み込むのに便利です。\n";
49$contentToWrite .= "複数行を処理する際はループと組み合わせて使います。\n";
50$contentToWrite .= "これはファイルの最終行です。\n";
51
52file_put_contents($testFileName, $contentToWrite);
53
54echo "テストファイル '{$testFileName}' を作成しました。\n\n";
55
56// 作成したファイルから複数行を読み込み、出力します。
57readMultipleLinesFromFile($testFileName);
58
59echo "\n読み込み処理が完了しました。\n";
60
61// テスト後に作成したファイルを削除し、環境をクリーンアップします。
62// unlink() はファイルを削除する関数です。
63if (file_exists($testFileName)) {
64    unlink($testFileName);
65    echo "テストファイル '{$testFileName}' を削除しました。\n";
66}
67
68?>

PHPのfgets関数は、指定されたファイルストリームからデータを1行ずつ読み込む際に使用されます。この関数は、ファイルの内容を処理する、特に複数行にわたるテキストファイルを扱う場面で非常に役立ちます。

引数としては、まずfopen関数などで開かれたファイルのストリーム(ファイルポインタ)を示すresource $streamを指定します。これは、どのファイルから読み込むかを識別するためのものです。次に、オプションの引数として?int $lengthがあり、読み込む最大バイト数を指定できますが、通常は省略され、改行文字が現れるまで、またはファイルの終端までを1行として読み込みます。

fgets関数は、読み込みに成功した場合、読み込んだ1行の文字列(改行文字を含む)を返します。ファイルの終端に達したり、読み込み中にエラーが発生したりした場合はfalseを返します。そのため、サンプルコードのようにwhileループと組み合わせて、戻り値がfalseでない間は読み込みを続けることで、複数行からなるファイル全体を1行ずつ処理できます。読み込み完了後には、fclose関数で開いたファイルストリームを閉じることで、システムリソースを適切に解放することが重要です。

PHPでファイル操作を行う際は、fopenでファイルを開いたら必ずfcloseでリソースを解放してください。fopenはファイルが見つからないなど、失敗時にfalseを返すため、必ずエラーチェックを組み込むことが重要です。fgets関数はファイルの終端や読み込みエラーでfalseを返すため、while (($line = fgets($fileHandle)) !== false)のように厳密にfalseと比較し、読み込み成功を判断してください。fgetsで読み込んだ行には改行文字が含まれますので、必要に応じてtrim()関数などで除去して利用します。

関連コンテンツ

関連プログラミング言語