2017-03-15 5 views
1

このエラーがポップアップしていますが、これが起こっているかどうかはわかりません。私は、次のデータを読み込むしようとしている:フォーマット済みアレイの作成Fortran ...ファイルエラーの終了

1 0000 1234 
2 0032 8383 
3 1201 3983 
4 1234 9292 
5 4567 9202 
6 7890 8382 
7 2324 9383 

は、最初の4行をスキップし、そして別のアレイ内の2番目の列に整数を読み込む(そうつのアレイは、4567、7890、2324、およびその他を製造しています9202、8382、および9383を生成する)。以下は、私が持っているコードです:

Program test 
Implicit None 
integer :: i 
integer, parameter :: & 
m=7, & !total number of line 
n=4, & !line to skip 
p=3  !lines to read 
integer,dimension(m)::arr, arr2 !file to read 

open(12,file='something.txt',status='old') 
10 format (T5, I4) 
do i=1,n 
read(12,10)arr(i) 
end do 
do i=1,p 
read(12,10)arr(i) 
write(*,*)arr(i) 
end do 

20 format (T11, I4) 
do i=1,n 
read(12,20)arr2(i) 
end do 
do i=1,p 
read(12,20)arr2(i) 
write(*,*)arr2(i) 
end do 
End Program test 

最初の配列が正しく読み込まれますが、それは二番目に到達したとき、ファイルエラーの終わりには、22が起動する行で発生します。私はFortranを初めて使っているので、なぜこれが起こっているのかよく分かりません。

+1

おそらく、配列の読み値の間に '巻き戻し 'がありません。つまり、もし私がこれを書いていたら、ファイルの一回のパスでそれを行い、 'T'編集を使わないでしょう。 – francescalus

+0

ダミー整数を宣言して( 'd')、' read(12、*)d、arr(i)、arr2(i) 'のような各行リストを読み込みます。 – agentp

答えて

0

フォーマット済みファイルでreadを実行すると、プログラムは行全体を読み取り、前方に移動します。

基本的にはarrを完全に読み込んだ後、ポインタはファイルの最後を指しており、それはarr2への読み取りが開始される場所です。

あなたは、2つのいずれかを行うことができます:2の間

  1. rewindファイルを読み込みます。
  2. 両方のアレイを同時に読み取ります。

2番目の解決策は、ファイルを2度読んでいないためです。ここでは例です:

program test 

    implicit none 
    integer :: i 
    integer, parameter :: & 
     m=7, & 
     n=4, & 
     p=m-n 

    integer :: arr(p), arr2(p) 

    open(unit=12, file='something.txt', action='READ', status='OLD') 

    do i = 1, n 
     read(12, "()") 
    end do 

    do i = 1, p 
     read(12, '(4X, I4, 2X, I4)') arr(i), arr2(i) 
    end do 

    close(12) 

    print*, arr 
    print*, arr2 

end program test 

私は個人的に2つの他の事をするだろう:

  1. はダミー整数型の変数を宣言した後、

    read(12, *) dummy, arr(i), arr2(i) 
    

    の代わりでフォーマットして周りいじくるを使用して読み取りますread声明。

  2. すべてのファイルI/Oに対して、私はいつもiostatパラメータの結果を調べて、すべてが意図どおりに機能することを確認します。

+0

ありがとうございます!これは今より多くの意味があります!追加の質問:もし私がファイルを2度読んでいたら、あなたが言及した2つの解決策の間に何が良いか? – cdmck004

+0

再度:ファイルI/OはメモリI/Oよりもはるかに遅いので、私はそれに反対します。つまり、あなたのコードに '20 format(T11、I4)'行の直前に 'rewind(12)'を追加すると、うまくいくはずです。 – chw21

関連する問題