ファイルの読み方 戻る
自然科学では多くのデータを扱う必要がある。データの数値を平均したり、データの数値から別の何かを計算するのがその例である。そのデータは「ファイル」に書かれている。
ファイルの形式として、エクセルの場合もあるが、それ以外の場合も多い。テキストファイルやバイナリファイルがその例である。
テキストファイルとはメモ帳などのテキストエディターで見ることができるファイルである。テキストファイルの場合、データの数値を見ることはテキストエディターで可能である。しかし何かを計算することはできない。そこでファイルの内容に応じて自分でプログラムを書く必要がある。
次の3行のファイル
をフォートランで読んでみる。ファイル名はsdata.txtでNドライブのtmpというフォルダにあるとする。
(1行目の赤色の数字1234123123123123456789はデータの数値の桁数を数えるため、HPに書いているもので、ファイルの内容ではないものとします)
1234123123123123456789
2007 10 8 2 -1.567
2007 10 8 4 11.234
2007 10 8 6 0.001
(HPに書く都合上、桁がずれているのもあります)
これは各行について4桁の整数1個、3桁の整数3個、小数点以下3桁である9桁の実数3個からなっている。
フォートランの書式で書けば、I4,3I3,F9.3である。
このファイルsdata.txtを読むプログラム例として、下のようになる。
*
open(13,file='n:\tmp\sdata.txt',status='old')
do 100 i=1,3
read(13,600) nyear,nmonth,nday,nhour,data
600 format(i4,3i3,f9.3)
100 continue
close(13)
write(6,*) nyear,nmonth,nday,nhour,data
end
*
1行目のopen(13,file='n:\tmp\sdata.txt',status='old')
で13という整数がある。これは何でもよいが、5,6や文番号で使われている数字(この例では100など)は避ける
file='n:\tmp\sdata.txt' でファイル名を指定する。
プログラムとファイル'sdata.txt'が同じフォルダにあればfile='sdata.txt'でも良い。
status='old' はファイル'n:\tmp\sdata.txt'が存在していることを示し,ファイルがなければエラーとなる。
do ループ、read文、format文はread文の数字が13になっているだけで,今まで習ったことと同じである。
ファイル'n:\tmp\sdata.txt'の1行を読むのに
read(13,600) nyear,nmonth,nday,nhour,data
のようにプログラムは1行で書く必要がある。
3行のファイルを読むため、do ループでも3回繰り返す。
ファイルを全部読んだら、
close(13)
でファイルを閉じる。
write(6,*) nyear,nmonth,nday,nhour,data
はデータを画面に表示させているが、このプログラムではファイルの最後の行
2007 10 8 6 0.001
しか表示しない。
実際に上のプログラムをfile00.fとしてNドライブに作成・実行すると
N:\>ftn77 file00.f /lgo
[Salford FTN77/Win32 v4.03, Copyright (c) Salford Software Ltd. 1988-1998]
Licensed to: FTN77 Personal Edition
Department: Non-commercial use only
NO ERRORS [<MAIN@>FTN77 Ver 4.03]
2007 10 8 6 1.000000E-03
と表示された。
(注:このコンパイラはftn77で現在皆さんが使っているのとは違います)
全部表示させたければ、次の例のように配列を使えばよいであろう。
*
integer nyear(3),nmonth(3),nday(3),nhour(3)
real data(3)
open(13,file='n:\tmp\sdata.txt',status='old')
do 100 i=1,3
read(13,600) nyear(i),nmonth(i),nday(i),
+ nhour(i),data(i)
600 format(i4,3i3,f9.3)
100 continue
close(13)
do 200 i=1,3
write(6,*) nyear(i),nmonth(i),
+ nday(i),nhour(i),data(i)
200 continue
end
*
(HPに書く都合上、プログラムの桁に正しくないのもあります)
なお1行が多すぎる場合、
read(13,600) nyear(i),nmonth(i),nday(i),
+ nhour(i),data(i)
と書けば良い。
このプログラムでは
integer nyear(3),nmonth(3),nday(3),nhour(3)
と配列の大きさを3としている。
これはファイル'n:\tmp\sdata.txt'は3行しかなく、nyearならばnyear(1),nyear(2),nyear(3)しか使われていないからである。
この場合、配列の大きさは3以上ならば良い。
実際に上のプログラムをfile01.fとしてNドライブに作成・実行すると
N:\>ftn77 file01.f /lgo
[Salford FTN77/Win32 v4.03, Copyright (c) Salford Software Ltd. 1988-1998]
Licensed to: FTN77 Personal Edition
Department: Non-commercial use only
NO ERRORS [<MAIN@>FTN77 Ver 4.03]
2007 10 8 2 -1.56700
2007 10 8 4 11.2340
2007 10 8 6 1.000000E-03
と表示された。(注:このコンパイラはftn77で現在皆さんが使っているのとは違います)