4

ファイルを開いて読み取る方法を学ぶために、いくつかのダミーコードを作成しました。次のtest.datがあるとしましょう

1
2
3
4
5
6
7
8
9
10

データファイルを開いて読み取るために次のコードを書きました

subroutine readdata
implicit none

integer             :: j
double precision    :: test

open(unit = 100, file = 'test.dat', status = 'old', action = 'read')
 do j = 1,  10
 read(100,*) test
 print *, 'N1=', test
end do

end subroutine

予想どおり、出力は以下に示されています

 gfortran -g  -I/usr/include -o main main.o subroutines.o -L/usr/lib64/liblapack -L/usr/lib64/libblas
 test=   1.0000000000000000     
 test=   2.0000000000000000     
 test=   3.0000000000000000     
 test=   4.0000000000000000     
 test=   5.0000000000000000     
 test=   6.0000000000000000     
 test=   7.0000000000000000     
 test=   8.0000000000000000     
 test=   9.0000000000000000     
 test=   10.000000000000000     
 Main finished.

ただし、次のようにデータが単一の行に格納されている場合

1 2 3 4 5 6 7 8 9 10

その場合、上記のコードは期待どおりに機能しません。行の最初の要素のみを読み取り、エラーを表示します

sharwani@linux-h6qd:~/PHD_research/myCodes/data> ./runcase.sh
rm -f *.o *.mod *.MOD *.exe *.stackdump main
gfortran -g  -I/usr/include -c main.f90
gfortran -g  -I/usr/include -c subroutines.f90
gfortran -g  -I/usr/include -o main main.o subroutines.o -L/usr/lib64/liblapack -L/usr/lib64/libblas
test=   1.0000000000000000    
At line 9 of file subroutines.f90 (unit = 100, file = 'test.dat')
Fortran runtime error: End of file

私の質問は、1 行に 2879 (1 x 2879) の数値が格納されているデータ ファイルがあるということです。データ ファイル内のすべての数値を開いて読み取るにはどうすればよいでしょうか。

4

2 に答える 2

11

デフォルトでは、各 Fortranreadステートメントは値のリストを読み取り、次の行の先頭に進みます。read入力ファイル内でカーソルを動かしながら動作すると考えてください。だからあなたの発言

read(100,*) test

入力ファイルの数値が別々の行にある場合に期待することを行います。それらがすべてファイル内の同じ行にある場合、最初の read ステートメントは 1 つの値 (つまりtest) を読み取り、次の行の先頭に進んで次の値を読み取りますが、次の行がなく、実行時エラーが発生します私たちに見せてくれました。

2つの簡単な解決策があります。

1 つ目は、1 つのステートメントの行から複数​​の値を読み取ることができます。たとえば、次のように宣言できます。

real, dimension(10) :: test

それから

read(100,*) test

すべての値を一度に配列に取得する必要があります。

2 番目に、各ステートメントnon-advancingの後に次の行の先頭にスキップしないようにプロセッサに指示する入力を使用できます。read次のようなもの(状況に応じて編集記述子を確認してください)

read(100,'(f8.2)',advance='no') test

この後者のアプローチを選択する場合、行からすべての値を読み取った後、次の行の先頭にスキップすることを忘れないでください。そのため、次のようなステートメントを実行する必要がある場合があります。

read(100,*)

値は読み取られませんが、次の行に進みます。

于 2013-10-17T09:00:15.463 に答える