ファイル入出力#
Fortranでは、ファイルはユニット識別子によって管理されます。ファイルシステムとのやり取りは、主にopen
およびinquire
組み込み手続きを通じて行われます。一般的に、ワークフローは、ファイルをユニット識別子に開き、読み取りおよび/または書き込みを行い、再度閉じることです。
integer :: io
open(newunit=io, file="log.txt")
! ...
close(io)
デフォルトでは、ファイルが存在しない場合は作成され、読み取りと書き込みの両方のために開かれます。既存のファイルへの書き込みは、最初のレコード(行)から開始されるため、デフォルトでファイルが上書きされます。
ファイルへの読み取り専用アクセスを作成するには、status
とaction
を以下のように指定する必要があります。
integer :: io
open(newunit=io, file="log.txt", status="old", action="read")
read(io, *) a, b
close(io)
ファイルが存在しない場合、ランタイムエラーが発生します。ファイルを開く前にファイルの存在を確認するには、inquire
関数を使用できます。
logical :: exists
inquire(file="log.txt", exist=exists)
if (exists) then
! ...
end if
または、open
手続きは、オプションのiostatおよびiomsgを返すことができます。
integer :: io, stat
character(len=512) :: msg
open(newunit=io, file="log.txt", status="old", action="read", &
iostat=stat, iomsg=msg)
if (stat /= 0) then
print *, trim(msg)
end if
iomsgには、エラーメッセージを保持するのに十分なストレージサイズを持つ固定長の文字型変数が必要なことに注意してください。
同様に、ファイルへの書き込みは、statusおよびactionキーワードを使用して行われます。新しいファイルを作成するには、以下を使用します。
integer :: io
open(newunit=io, file="log.txt", status="new", action="write")
write(io, *) a, b
close(io)
または、status="replace"
を使用して既存のファイルを上書きできます。使用するstatusを決定する前に、ファイルの存在を最初に確認することを強くお勧めします。出力ファイルに追加するには、positionキーワードを明示的に指定できます。
integer :: io
open(newunit=io, file="log.txt", position="append", &
& status="old", action="write")
write(io, *) size(v)
write(io, *) v(:)
close(io)
ファイル内の位置をリセットするには、組み込み手続きrewind
およびbackspace
を使用できます。rewind
は最初のレコード(行)にリセットしますが、backspace
は前のレコード(行)に戻ります。
最後に、ファイルを削除するには、ファイルを開いてから、閉じた後に以下のように削除できます。
logical :: exists
integer :: io, stat
inquire(file="log.txt", exist=exists)
if (exists) then
open(file="log.txt", newunit=io, iostat=stat)
if (stat == 0) close(io, status="delete", iostat=stat)
end if
便利なIO機能は、status="scratch"
で開くことができるスクラッチファイルです。これらは、ユニット識別子を閉じると自動的に削除されます。