0

私は Fortran を初めて使用し、継承したより大きなプログラムの一部であるコードの一部を再利用しようとしています。プログラムを実行すると、出力ファイル名の入力を求められます。これらの出力ファイル名をコードで直接指定したいので、プログラムを並行して/一度に実行できます (プログラムの実行時間は約 15 時間で、66 個の異なるファイルに対して実行する必要があるため、かなり時間がかかるため、次々に実行するよりも一度にすべて実行することをお勧めします)。

私が扱っているコードは次のようになります。

24  print *,'Enter output filename'
25  read(*,*) fout
26  print *,'Enter parameter estimate output filename'
27  read(*,*) foutb
28  print *,'Enter seed for random number generator'
29  read(*,*) idum
30  if(idum.gt.0) idum = -idum

私が試したことはすべて私に与えます:

At line 25 of file v1.f95:
Fortran runtime error: End of file

適切な行末があることを確認しました。助言がありますか?

4

3 に答える 3

3

私が質問を正しく理解していれば、実行時に多数の出力ファイル名/その他の変数をプログラムに渡したいと考えています。これは、単純な名前リスト入力ファイルを使用し、この単一のファイルをプログラムに渡すことで処理できます。たとえば、コードは次のようになります。

character(20) :: file1, file2, file3
integer :: idum
namelist /input/ file1, file2, file3, idum

read(unit = iunit, nml = input)

iunit、以前に開いた入力ファイルに接続されている I/O ユニットです。このファイルの内容は次のようになります

&input                    ! Name of corresponding namelist group
  file1 = 'file1.out',
  file2 = 'file2.out',
  file3 = 'file3.out',
  idum = 1
/

Namelist ファイルは非常に扱いやすいです。エントリの順序、レコードの長さ、またはコメントは気にしません。namelist ファイル内の変数を省略したり (それらの値は変更されません)、1 つのファイルに複数の namelist (同じ名前であっても) を含めることができます。

于 2012-10-04T13:36:58.150 に答える
0

おそらく最も簡単な解決策は、いくつかの単純な read(*,*) しかないと仮定すると、コードをそのままにして、必要な文字列を標準入力にパイプするだけです。

echo "file1\nfile2\n3" | executable

(csh でテスト済み。別のシェルでは少し調整が必要になる場合があります)

ところで、エラーメッセージは、端末ではなく標準入力パイプから既に読み取っていて、以前の読み取りで入力が使い果たされたと思わせます。

于 2012-10-05T16:55:38.403 に答える