【PHP8.x】ftell関数の使い方

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

作成日: 更新日:

基本的な使い方

ftell関数は、指定されたファイルポインタの現在位置を取得する関数です。ファイルポインタとは、ファイル内で次にデータを読み書きする位置を示す目印です。この関数を使うと、ファイルの先頭(0バイト目)から数えて現在位置が何バイト目にあるかを整数値で取得できます。

引数には、fopen()関数などで開かれたファイルのリソースを渡します。成功すると、ファイルの先頭からのバイトオフセットが返されます。ファイルポインタの取得に失敗した場合や、無効なリソースが指定された場合は、falseが返されます。

この関数は、fseek()関数と組み合わせて使われることが多く、fseek()でファイルポインタを移動させた後、その位置が正しく設定されたかを確認したり、ファイル処理途中の位置を記憶して後で再開したりする際に役立ちます。正確なファイル操作のため、ftell関数の戻り値を確認し、適切なエラー処理を行うことが推奨されます。

構文(syntax)

1ftell(resource $stream): int|false

引数(parameters)

resource $stream

  • resource $stream: ファイルポインタ(ストリーム)を指定するリソース型

戻り値(return)

int|false

ファイルポインタの現在の位置をバイト数で返します。ファイルポインタが移動できない場合は false を返します。

サンプルコード

PHP ftell関数でファイルポインタ位置を取得する

1<?php
2
3/**
4 * ftell関数の基本的な使用方法を示すサンプルコードです。
5 * ファイルポインタの現在の位置をバイト数で取得します。
6 */
7function demonstrateFtell(): void
8{
9    // 一時ファイル名を作成します。
10    // sys_get_temp_dir() はシステムのテンポラリディレクトリを返します。
11    $tempFilePath = sys_get_temp_dir() . DIRECTORY_SEPARATOR . 'ftell_example_' . uniqid() . '.txt';
12
13    // ファイルを読み書きモード ('w+') で開きます。
14    // 'w+' モードはファイルが存在しない場合は作成し、存在する場合は内容を空にします。
15    // ファイルポインタはファイルの先頭に置かれます。
16    $fileHandle = fopen($tempFilePath, 'w+');
17
18    if ($fileHandle === false) {
19        echo "エラー: ファイル '{$tempFilePath}' を開けませんでした。\n";
20        return;
21    }
22
23    echo "ファイル '{$tempFilePath}' を開きました。\n";
24
25    // ftell() でファイルポインタの初期位置を取得します。
26    // 'w+' モードで開いた場合、通常は 0 (ファイルの先頭) です。
27    $initialPosition = ftell($fileHandle);
28    if ($initialPosition === false) {
29        echo "エラー: ファイルポインタの初期位置を取得できませんでした。\n";
30        fclose($fileHandle);
31        unlink($tempFilePath); // 一時ファイルを削除
32        return;
33    }
34    echo "初期のファイルポインタ位置: {$initialPosition} バイト\n"; // 出力例: 0 バイト
35
36    // ファイルに文字列を書き込みます。
37    // fwrite() を実行すると、ファイルポインタは書き込んだデータの最後に移動します。
38    $dataToWrite = "Hello, PHP ftell example!";
39    $bytesWritten = fwrite($fileHandle, $dataToWrite);
40
41    if ($bytesWritten === false) {
42        echo "エラー: ファイルに書き込みができませんでした。\n";
43        fclose($fileHandle);
44        unlink($tempFilePath); // 一時ファイルを削除
45        return;
46    }
47    echo "ファイルに '{$dataToWrite}' ({$bytesWritten} バイト) を書き込みました。\n";
48
49    // ftell() で書き込み後のファイルポインタの位置を取得します。
50    // 書き込んだバイト数と同じ値になるはずです。
51    $currentPosition = ftell($fileHandle);
52    if ($currentPosition === false) {
53        echo "エラー: 書き込み後のファイルポインタ位置を取得できませんでした。\n";
54        fclose($fileHandle);
55        unlink($tempFilePath); // 一時ファイルを削除
56        return;
57    }
58    echo "書き込み後のファイルポインタ位置: {$currentPosition} バイト\n"; // 出力例: 24 バイト
59
60    // ファイルポインタをファイルの先頭に戻します。
61    // rewind() は fseek($fileHandle, 0) と同じです。
62    rewind($fileHandle);
63    echo "ファイルポインタを先頭に戻しました。\n";
64
65    // ftell() で先頭に戻った後のファイルポインタの位置を取得します。
66    // 再び 0 (ファイルの先頭) になっているはずです。
67    $afterRewindPosition = ftell($fileHandle);
68    if ($afterRewindPosition === false) {
69        echo "エラー: rewind後のファイルポインタ位置を取得できませんでした。\n";
70        fclose($fileHandle);
71        unlink($tempFilePath); // 一時ファイルを削除
72        return;
73    }
74    echo "rewind後のファイルポインタ位置: {$afterRewindPosition} バイト\n"; // 出力例: 0 バイト
75
76    // ファイルを閉じます。
77    fclose($fileHandle);
78    echo "ファイルを閉じました。\n";
79
80    // 作成した一時ファイルを削除します。
81    if (unlink($tempFilePath)) {
82        echo "一時ファイル '{$tempFilePath}' を削除しました。\n";
83    } else {
84        echo "エラー: 一時ファイル '{$tempFilePath}' を削除できませんでした。\n";
85    }
86}
87
88// demonstrateFtell 関数を実行します。
89demonstrateFtell();
90
91?>

PHP 8のftell関数は、開いているファイルのファイルポインタの現在の位置をバイト数で取得するために使用されます。引数にはfopenなどで取得したresource型(ファイルポインタ)を指定します。成功時にはファイル先頭からのバイト数をint型で返し、失敗時にはfalseを返します。

このサンプルコードでは、まず一時ファイルを読み書きモード(w+)で開きます。ファイルを開いた直後にftellを実行すると、ファイルポインタの初期位置である0バイト目を示します。次に、ファイルに文字列を書き込むと、ファイルポインタは書き込んだデータの末尾に移動します。この状態で再度ftellを実行すると、書き込んだデータのバイト数と同じ位置が取得できます。さらに、rewind関数でファイルポインタをファイルの先頭に戻した後、ftellを呼び出すと再び0バイト目が示されることが確認できます。このように、ftellはファイルの読み書き中に現在の位置を把握するために利用できます。最後に、開いたファイルを閉じ、作成した一時ファイルを削除しています。

ftell関数は、ファイルポインタの現在位置をバイト数で整数値として返します。ファイル操作に失敗した場合はfalseを返すため、必ず戻り値がfalseでないかを確認し、エラー処理を行うようにしてください。ファイルを開く際に指定するfopenのモードによって、ファイルポインタの初期位置が異なる点に注意が必要です。fwriteなどでファイルに書き込むとポインタが書き込んだデータの最後に移動します。rewindfseekを使ってファイルポインタの位置を調整できます。ファイルをオープンした後は、必ずfcloseでファイルリソースを閉じ、一時ファイルはunlinkで削除するなど、適切な後処理を行うことがシステムを安全に運用するために非常に重要です。

関連コンテンツ