コンピューティングにおいて、End Of File(エンド・オブ・ファイル、略称:EOF[1])とは、ファイルやストリームにおいて、それより先に読み出すデータが存在しない(終端である)ことを示す状態のことである。
標準Cライブラリでは、getcharのような文字を読み取る関数は、ファイルやストリームの終端を読み取った時に、シンボル値(マクロ) EOF
に等しい値を返す。EOF
の実際の値は実装に依存するが(ただし、GNU Cライブラリなど、一般的には -1 が使用される[2])、文字を示す全てのコードと異なる値で示される。fgets()はヌルポインタが返るなど、同じ言語においても様々である。
データをシーケンシャルアクセスしていって、最後のデータまで読み込んだ場合(あるいは、さらに次のデータを読み込もうとした後に[3])、EOFが発生する。readなどのブロックを読み取る関数は、戻り値として読み取ったバイト数を返し、これが要求したバイト数よりも少ない場合は、EOFが発生したかエラーが発生したことを示す(どちらが発生したかは、errno
を確認するか、ferror
などの専用の関数を使用することで知ることができる)。
データベースにおいて与えられた条件に合うデータが存在しない場合、EOFとなる。EOFの判定方法は処理系により異なる。
端末からの入力は、(デバイスが切断されない限り)実際には「終了」することはないが、端末に複数の「ファイル」を入力することができるように、入力の終了を示すためのキー配列が予約されている。UNIXでは、キーストロークのEOFへの変換はターミナルドライバによって行われるため、プログラムはターミナルを他の入力ファイルと区別する必要がない。デフォルトでは、ドライバは行頭のControl-DをEOFに変換する。実際のControl-D(ASCIIコード04)を入力ストリームに挿入するには、ユーザは"quote"コマンド文字 (通常はControl-V) を前に付ける。AmigaDOS(英語版)では、Control-Dの代わりにControl-\を使用する。
DOS、Windows、CP/Mや、多くのDECオペレーティングシステム(RT-11、VMSなど)では、端末からの読み込みでEOFが発生することはない。その代わり、プログラムはソースが端末(または他の「文字デバイス」)であることを認識し、予約された文字やシーケンスをEOFとして解釈する。一般的には、ASCIIコード26(0x1A)のControl-ZがEOFとして解釈される。
一部のDOSシェル(COMMAND.COM)やOSのユーティリティプログラム(EDLINなど)を含むいくつかのMS-DOSプログラムは、テキストファイル内のControl-Zを意味のあるデータの終わりを示すものとして扱い、テキストファイルの書き込みの際にControl-Zを最後に追加する。これは次の2つの理由で行われた。
- CP/Mとの後方互換性のため。CP/Mのファイルシステムでは、128バイト長のレコードの倍数でしかファイルの長さを記録していなかったため、ファイルがレコードの途中で終わった場合、意味のあるデータの終わりをマークするためにControl-Zが使用されていた。MS-DOSのファイルシステム(FAT)では常にファイルの正確なバイト長を記録しているので、MS-DOSではこのようにする必要はなかった。
- プログラムが入力を読み取る際に、端末とテキストファイルの両方で同じコードを使用することができるようにするため。
ANSI X3.27-1969の磁気テープ規格では、ファイルの終わりはテープマーク(tape mark)で示されていた。これは、約3.5インチのテープのギャップに続けて、9トラックテープ(英語版)の場合は0x13(16進数)、7トラックテープ(英語版)の場合は17(8進数)という文字を含む1バイトで構成されていた[4]。end-of-tapeは一般的にEOTと略され、2つのテープマークで示された。これはIBM 360などで使用されていた規格である。テープの物理的な終了が迫っていることを知らせるために使用された反射ストリップは、EOTマーカーとも呼ばれていた。