15 ファイル操作
15.1 ファイルの基本操作
ファイルへの入出力に際して、ファイルのオープン(open 文)とクローズ(close 文)が必要です。 この際、実際のデータ入出力は read 文と write 文を用いて行います。ファイルへの書き出しは今まで行ってきた画面への出力と同様な出力が指定のファイルに出力が行われるようになります。 ファイルからの読み込みも同様にキーボードから入力される代わりにファイルの内容が入力されます。
ファイルのオープンは open 文により行います。
! 書き出し用にオープンする方法 open(装置番号, file='mydata.dat', status='replace') ! 読み込み用にオープンする方法 open(装置番号, file='mydata.dat', status='old')
ここで、装置番号は 1 から 99 の間の任意の番号が指定できることになっていますがこのうち多くの環境では 5 番が標準入力(キーボード)、6 番が標準出力(画面)にあらかじめ結合されていますので、5 と 6 は利用しないことが推奨されています。
ファイル名は実行時のカレントディレクトリからの相対パス、もしくは絶対パスでの記述となります。
status=の指定では主に以下の指定が行えます。
- 'old': 指定されたファイルが存在しなければなりません。 存在しない場合にはエラーとなります。 主に読み込み時のオープンで利用されます。
- 'new': 指定されたファイルが存在していてはなりません。 存在している場合にはエラーとなります。
- 'replace': 指定されたファイルが存在していない場合には新しくファイルが作成されます。 存在している場合にはまずそのファイルが削除されて新しいファイルが作成されます。
ファイルのクローズは close 文により行います。 この際に open 文で使用した対応する装置番号を指定します。
close(装置番号) ! 装置番号はopen文で指定した装置番号と対応している必要がある
データの書き出しは write 文により行います。 この際に open 文で指定した装置番号を指定します。
open(17, file='output.dat', status='replace') write (17,*) "Hello!" close(17)
データの読み込みは read 文により行います。 write 文と同様に open 文で指定した装置番号の指定が必要となります。
open(17, file='input.dat', status='old') read (17,*) a, b, c close(17)
[ fileIO.f90 ] - ファイル入出力のサンプル
program fileIO implicit none integer i, j, k open(17,file='mydata.dat', status='replace') write (17,*) 100, 200, 300 write (17,*) 400 write (17,*) 500, 600 close(17) ! 同じファイルを今度は読み込み用にオープンする open(18,file='mydata.dat', status='old') read (18,*) i, j, k print *, i, j, k read (18,*) i print *, i read (18,*) i, j print *, i, j close(18) end program fileIO 出力例: 100 200 300 400 500 600
15.2 ファイル操作における例外処理
15.2.1 ファイル操作におけるエラー処理
ファイルをオープンする際にファイルが見つからないなどのエラーが発生した場合に、通常は(何も指定を行わないと)エラーメッセージが出力されて処理が終了します。 プログラムでエラー発生時の処理を行いたい場合には err 指定子を指定して行うことができます。 err 指定子はエラー発生時に指定された文番号へ処理を移行させます。 以下に err の使用例を示します。
open(11, file="data.txt", status="old", err=100 ) ... 正常にオープンできた場合の処理 ... ... 100 ... エラー発生時の処理 ...
読み込み時や書き出し時におけるエラー処理も同様に err を用いて行うことができます。 以下に例を示します。
real a(1000), b(1000) ... read(11, *, err=200 ) a write(12, *, err=300 ) b ... stop 200 print *, "Read error" stop 300 print *, "Write error" stop
15.2.2 ファイルの終端を検出する
読み込み時にファイルの終端を検出する場合には end 指定子が利用可能です。 end 指定子は err 指定子と同じような使い方で利用でき、ファイルの終端に到達した際に指定の場所に処理を移行させることが可能です。 以下にファイルの終端を検出する例を示します。do read (11, "(A)", end=999 ) linebuf ... end do 999 print *, "Done reading!" ...
15.3 ★ 練習課題:ファイルへ Hello World
ファイル名を入力し、そのファイルに "Hello World!" と出力するプログラムを作成して下さい。処理手順例
-
変数を宣言する
例)
character(len=80) filename ! ファイル名を格納する変数 - 出力ファイル名を入力してほしい旨を画面に出力する(print 文)
- 出力ファイル名をキーボードから入力する(read 文)
-
open文で指定ファイルをオープンする
例)
open(20, file=filename, status='replace') -
openで開いたファイル(装置番号を指定)に「Hello World!」と出力する(write 文)
例)
write(20,*) "Hello World!" - open で開いたファイル(装置番号を指定)をクローズする(close 文)
補足: filename に(フルパスではなく)ファイル名だけが指定されている場合、カレントフォルダにファイルが作成されます。
実行例: Please enter file name: testdata.txt testdata.txtの中身: Hello World![ kadai-hello-file.f90 ] - ファイルへ Hello World と出力するプログラム例
15.4 ★ 練習課題:ファイルの行数をカウントする
テキストファイルのファイル名を入力し、そのファイルの行数をカウントして出力するプログラムを作成して下さい。処理手順例
-
変数を宣言する
例)
character(len=80) filename ! ファイル名を格納する変数
integer counter - 出力ファイル名をキーボードから入力する(read 文)
-
open 文で指定ファイルをオープンする
例)
open(20, file=filename, status='old') -
以下の2ステップを繰り返す(do ~ end do)
例)
do -
終端になるまで 1 レコード(行)づつ読む(do ループ + read 文、終端の検出は end=)
例)
read(20,'()',end=999) -
カウンタを増やす
例)
counter = counter + 1 -
カウンタを出力する
例)
print *, "Counter is", counter - open で開いたファイル(装置番号を指定)をクローズする(close 文)
実行例: Enter file name to count lines: test.txt Number of lines is 66[ kadai-count-lines.f90 ] - ファイルの行数をカウントするプログラム例
前へ 上へ 次へ