データ入出力とフォーマット指定

本記事ではデータ入出力と書式指定について説明します。
Fortranの入出力命令は以下のようにread文とwrite文を用いて行います。

入力: read(「ユニット番号」,「フォーマット」)
出力: write(「ユニット番号」,「フォーマット」)

ファイル入出力には標準入出力(プロンプト画面に直接表示)と外部ファイル入出力がありますが、これらを以下に詳しく説明します。また、記事の最後にはサンプルプログラムを掲載しました。

スポンサーリンク

標準入出力

標準入出力をフォーマット無しで行う場合は、ユニット番号とフォーマットを *(アステリスク) に指定し、以下のように記述します。

1
2
  read(*,*) i ! 変数iを入力
  write(*,*) i ! 変数iを出力

外部ファイル入出力

外部ファイル入出力の際には、ユニット番号と入出力ファイル名を関連付けておく必要があります。処理系によっては、あらかじめシステムによって、ユニット番号「5」番が標準入力に、「6」番が標準出力に予約されているので、「5」番と「6」番を除く正整数を指定します。

ファイル名は以下のように指定します。

open(「ユニット番号」,file=「ファイル名」,
form=「アスキーかバイナリ―か」,status=「上書き禁止か否か」)

test.txt というアスキー形式のファイルをユニット番号「1」番に関連付ける場合は、以下のように記述します。open文によってファイル名を指定しなかった場合は、fort.「ユニット番号」というファイル名が割り当てられます。

1
2
  open(1,file='test.txt',form='formatted',status='old') ! for reading
  open(1,file='test.txt',form='formatted',status='unknown') ! for writing

入力の場合は、status=’old’を指定します。こうしておけば上書き禁止となり、入力と出力を間違えた際にも大切なデータを失わないようにできます。逆に出力の場合は、status=’unknown’を指定します。
バイナリ―形式の場合は、form=’unformatted’と記述します。バイナリ―データの入出力については別記事で説明します。

test.txt にフォーマット無しでデータ入出力を行う場合は、以下のように記述します。ユニット番号はopen文で指定したものと同一にします。

1
2
  read(1,*) i ! 変数iを入力
  write(1,*) i ! 変数iを出力

データ入出力が終わったら、以下のようにclose文を使ってユニット番号を解放します。ユニット番号はopen文で指定したものと同一にします。

1
  close(1)

フォーマット指定

指定規則が少しややこしいですが、使うパターンは限られているので、自分がよく使う書式をコピペして再利用するのが良いと思います。

整数(i = 12345)を出力する場合は以下のように記載します。フォーマットは ‘()’ で括ります。

1
2
  i = 12345
  write(*,'(i5)') i ! 5文字表示

出力結果
12345

write(*,‘(i6)’) i と記載した場合は、
_12345
というように右詰めで表示されます。

実数(x = 1.2345)を出力する場合は以下のように記載します。

1
2
  x = 1.2345
  write(*,'(f6.4)') x ! 6文字(.を含む)、かつ小数点以下4桁を表示

出力結果
1.2345

write(*,‘(f7.3)’) x と記載した場合は、
__1.234
というように右詰め、小数点以下3桁表示となります。

実数(y = 1.2345×10^10)を指数表示で出力する場合は以下のように記載します。

1
2
  y = 1.2345d10
  write(*,'(e10.4)') x ! 10文字(.及び指数部を含む)、かつ小数点以下4桁を表示

出力結果
0.1234E+11

文字列(o = ‘abcde’)を出力する場合は以下のように記載します。

1
  write(*,'(a5)') o ! 5文字

出力結果
abcde
write(*,‘(a)’) o と指定しても同じ出力になります。

複数のデータを1行に出力する場合は以下のように記載します。

1
  write(*,'(i5,1x,f6.4,1x,a)') i, x, o

出力結果
12345 1.2345 abcde
ここで、1x は1文字分スペースを入れる、という意味です。

フォーマットが同一のデータを複数出力する場合は以下のように記載します。

1
  write(*,'3(i5,1x)') i, i, i

出力結果
12345 12345 12345

サンプルプログラム

サンプルプログラムを下記します。4-8行目が型宣言、10-15行目が値の代入、17-29行目が標準入出力のサンプル、31-47行目が外部入出力(スペース区切りテキスト, カンマ区切りテキスト)のサンプルです。

以下のFortranプログラムをコピペし、****.f90の名前で保存して下さい(****の部分は適当でいいです)。コピペが面倒な場合は、こちらからダウンロードして下さい(右クリックメニューから保存)。→ sample03.f90

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
program sample03
  implicit none
!--------------------------------------------------------------------
  integer :: i, n
  real(8) :: x
  real(8) :: y
  character(len=5) :: o
  character(len=250) :: p
!--------------------------------------------------------------------
  i = 12345
  n = 3
  x = 1.2345d0
  y = 1.2345d10
  o = ''
  p = ''
!--------------------------------------------------------------------
  write(*,'(a)') 'Standard I/O'
  write(*,*) 'Input text'
  read(*,*) p
  o = p(1:5)
  write(*,'(a5)') o
  write(*,*) i
  write(*,'(i5)') i
  write(*,'(i6)') i
  write(*,'(f6.4)') x
  write(*,'(f7.3)') x
  write(*,'(e10.4)') y
  write(*,'(i5,1x,f6.4,1x,a5)') i, x, o
  write(*,'(3(i5,1x))') i, i, i
!--------------------------------------------------------------------
  write(*,'(a)') 'External I/O (sample03.txt)'
  open(1,file='sample03.txt',form='formatted',status='unknown')
  write(1,'(i5,1x,f6.4,1x,a5)') i, x, o
  close(1)
  open(1,file='sample03.txt',form='formatted',status='old')
  read(1,*) i, x, o
  close(1)
  write(*,'(i5,1x,f6.4,1x,a5)') i, x, o
!--------------------------------------------------------------------
  write(*,'(a)') 'External I/O (sample03.csv)'
  open(1,file='sample03.csv',form='formatted',status='unknown')
  write(1,'(i5,a,f6.4,a,a5)') i, ',', x, ',', o
  close(1)
  open(1,file='sample03.csv',form='formatted',status='old')
  read(1,*) i, x, o
  close(1)
  write(*,'(i5,1x,f6.4,1x,a5)') i, x, o
!--------------------------------------------------------------------
end program sample03

使い方は、前記事と同様に、****.f90を以下の****.batにドラッグ&ドロップするだけです。
64bit用 → comp_exe_64.bat
32bit用 → comp_exe_32.bat

プログラムを実行すると、Input textと表示されるので、適当な文字列(250文字以内)を入力し、リターンを押して下さい。

sample03

入力した文字列の先頭5文字が変数 o に格納された後、標準出力で表示されます。続いて、整数, 実数, 文字列が表示されます。次に、整数, 実数, 文字列がsample03.txt(スペース区切りテキスト), sample03.csv(カンマ区切りテキスト)に出力され、これを読み込んだ後、標準出力されます。sample03.txtとsample03.csvの中身をテキストエディタで確認してみて下さい。sample03.csvはエクセルでも表示することができます。


→ 次の記事へ(四則演算と組込み関数)
← 前の記事へ(記述ルールと変数の型)
目次(Fortran90)

スポンサーリンク

コメントをどうぞ

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です