Fortran : ファイル操作

Fortranでファイルを開く際、open文を用います。

open文の基礎

Fortranでファイルを開く際、以下のように記述します。

open(10,file="sample.dat",iostat="ios",action="read",&
& form="unformatted",status="old",access="direct",position="rewind",recl=20*20*4)

&は、複数行にまたがって書きたい場合に用いられるもので、なくて問題ありません。

非常に長いですが、通常、テキストファイルを開くなら

open(10,file="sample.txt")

バイナリファイルを開くなら

open(10,file="sample.bin",access="direct",recl=20*20*4)

となり、デフォルトで問題がなければ長いコードを書く必要がなく、ファイルを開くことができます。

ここで、10は、装置番号であり、1~99までの任意の番号を指定できます。

しかし、5番と6番は、それぞれが標準入力、標準出力になっているため、推奨されません。

引数fileには、開きたいファイルを指定します。

引数accessには、ファイルの読み書きの方法を指定します。今回は、直接探査方式directを指定しています。

引数reclは、データサイズを指定します。

上の例では、20×20の4byteごとのデータとしています。

引数accessや引数reclなど、open文の引数のより詳しい内容は今後の記事にまとめますが、ひとまずこのコードでファイルは開けます。

テキストファイルでのファイル操作

以下のようなテキストファイルを読み込もうと思います。データ間は改行されています。

   1.00000000
   2.00000000
   3.00000000
   4.00000000
   5.00000000

読み込む

read文を用いますが、以下の例では、テキストファイルの内容を一行で読み込んでいます。また、ファイルを開いた装置番号と同じにしてください。また、行頭に変数dataを定義してください。

real::data(5)
処理
read(10,*)data(:)

すべてのデータを改行区切りで読み込みたいときは、繰り返し処理をする必要があります。

do i=1,5
    read(10,*)data(i)
enddo

書き出す

open文を用いて書き込みたいファイルを開きましょう。

書き込みたいファイルの装置番号と同じにしてください。また、行頭に変数dataを定義してください。

write文を用いますが、以下の例では、読み込んだ内容を一行で書き出しています。

real::data(5)
処理
write(20,*)data

データを改行区切りで書き出したいときは、繰り返し処理をする必要があります。

do i=1,5
    write(20,*)data(i)
enddo

実例

テキストファイルを読み込んで、別のテキストファイルに書き出すプログラムです。

implicit none
real::data(5)
integer::i
open(10,file="before.txt")
open(20,file="after.txt")
do i=1,5
   read(10,*)data(i)
   write(20,*)data(i)
enddo
stop
end

バイナリファイルでのファイル操作

以下のようなバイナリファイルを読み込もうと思います。実際は、バイナリファイルですので人間の目にはこのように見えません。

   1.00000000
   2.00000000
   3.00000000
   4.00000000
   5.00000000

読み込む

テキストファイルの時と同様にread文を用います。ファイルを開いた装置番号と同じにしてください。

引数recレコード番号であり1としましょう。また、行頭に変数dataを定義してください。

real::data(5)
処理
read(10,rec=1)data(:)

書き込む

テキストファイルの時と同様にwrite文を用います。open文を用いて書き込みたいファイルを開きましょう。

書き込みたいファイルの装置番号と同じにしてください。また、行頭に変数dataを定義してください。

real::data(5)
処理
write(20,rec=1)data(:)

実例

implicit none
real::idata(5)
integer::i
open(11,file="sample.bin",access="direct",recl=5*4)
open(21,file="after.bin",access="direct",recl=5*4)

read(11,rec=1)idata(:)
write(21,rec=1)idata(:)

stop
end