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