プロが教えるわが家の防犯対策術!

fortran初心者です。
fortranで下のようにNAが含まれたデータを読み込んで2次元配列に格納することは可能でしょうか。

1 2 3
4 NA 6
7 8 9

以下のコードで試したところ、「Fortran runtime error: Bad real number in item 2 of list input」と表示され、readできませんでした。よい方法があれば教えていただきたいです。

program openclose
implicit none
integer i,j
integer,parameter :: n=3,m=3
real,dimension(3,3) :: a
open(10,file='file.dat',status='old')
do i=1,n
read(10,*)(a(i,j),j=1,m)
end do
do i=1,n
write(*,*)(a(i,j),j=1,m)
end do
close(10)
end program openclose

A 回答 (1件)

読み込み時に,"iostat = 変数名"を付けると,エラーのチェックができます。


とりあえず8行目で "iostat = ios" と書けばエラーは防げるのですが,
j = 2 でエラーになるので,j = 3 は実行されず,a(2, 3) 成分も値が入らなくなります。

そこで,いったん文字列の区切りとしてデータを保存し,その後1つずつ値を代入する形です。
ソースは次のような感じだと思います。

program openclose
 implicit none
 integer, parameter :: n = 3, m = 3
 integer :: i, j, ios
 character(len=128) :: token(m)
 real :: a(n, m)

 open(10, file = 'file.dat', status = 'old')

 do i = 1, n
  read(10, *) token(1 : m) ! スペース区切りで文字列として保存
  do j = 1, m
   ! j 番目の区切りから読み込み,エラーが出たら ios /= 0 になる
   read(token(j), *, iostat = ios) a(i, j)
   if (ios /= 0) a(i, j) = -1.0d+00
  end do
 end do

 do i = 1, n
  write(*, *) (a(i, j), j = 1, m)
 end do

 close(10)

 stop
end program openclose
    • good
    • 1
この回答へのお礼

とてもスマートな解決策で目から鱗です。"iostat = 変数名"は今後も使えそうです。とても勉強になりました。ありがとうございました。

お礼日時:2018/03/17 21:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています