関連情報

Fortran Builder
ナビゲーション:前へ   上へ   次へ

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!"と出力するプログラムを作成して下さい。

処理手順例

  1. 変数を宣言する
     例)character(len=80) filename  ! ファイル名を格納する変数
  2. 出力ファイル名を入力してほしい旨を画面に出力する(print文)
  3. 出力ファイル名をキーボードから入力する(read文)
  4. open文で指定ファイルをオープンする
     例)open(20, file=filename, status='replace')
  5. openで開いたファイル(装置番号を指定)に「Hello World!」と出力する(write文)
     例)write(20,*) "Hello World!"
  6. openで開いたファイル(装置番号を指定)をクローズする(close文)

補足:filenameに(フルパスではなく)ファイル名だけが指定されている場合、 カレントフォルダにファイルが作成されます。

実行例:
 Please enter file name:
testdata.txt

testdata.txtの中身:
 Hello World!
[ kadai-hello-file.f90 ] - ファイルへHello Worldと出力するプログラム例

15.4 ★ 練習課題:ファイルの行数をカウントする

テキストファイルのファイル名を入力し、 そのファイルの行数をカウントして出力するプログラムを作成して下さい。

処理手順例

  1. 変数を宣言する
     例)character(len=80) filename  ! ファイル名を格納する変数
       integer counter
  2. 出力ファイル名をキーボードから入力する(read文)
  3. open文で指定ファイルをオープンする
     例)open(20, file=filename, status='old')
  4. 以下の2ステップを繰り返す(do 〜 end do)
     例)do
  5. 終端になるまで1レコード(行)づつ読む(doループ+read文、終端の検出はend=)
     例)read(20,'()',end=999)
  6. カウンタを増やす
     例)counter = counter + 1
  7. カウンタを出力する
     例)print *, "Counter is", counter
  8. openで開いたファイル(装置番号を指定)をクローズする(close文)
実行例:
 Enter file name to count lines:
test.txt
 Number of lines is 66
[ kadai-count-lines.f90 ] - ファイルの行数をカウントするプログラム例


ナビゲーション:前へ   上へ   次へ

Results matter. Trust NAG.
Privacy Policy | Trademarks