ファイル入出力#

Fortranでは、ファイルはユニット識別子によって管理されます。ファイルシステムとのやり取りは、主にopenおよびinquire組み込み手続きを通じて行われます。一般的に、ワークフローは、ファイルをユニット識別子に開き、読み取りおよび/または書き込みを行い、再度閉じることです。

integer :: io
open(newunit=io, file="log.txt")
! ...
close(io)

デフォルトでは、ファイルが存在しない場合は作成され、読み取りと書き込みの両方のために開かれます。既存のファイルへの書き込みは、最初のレコード(行)から開始されるため、デフォルトでファイルが上書きされます。

ファイルへの読み取り専用アクセスを作成するには、statusactionを以下のように指定する必要があります。

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"で開くことができるスクラッチファイルです。これらは、ユニット識別子を閉じると自動的に削除されます。