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(即使是同名的)。

于 2012-10-04T13:36:58.150 回答
0

我认为您的错误来自以下事实:如果没有字符串作为格式说明符,则无法读取 fout。在第 25 行尝试这个(和其他阅读)

read(*,'(a)') fout

如果您从 fout 的定义中复制长度,您可以改进这一点,就像这样(猜测大小)

CHARACTER fout(25) . . . read(*,'(a25)') fout

您正在从标准输入读取(这是第一个参数中的星号)。我假设您的输入文件是 ASCII 文本。就像现在一样,您可以在文件的前两行指定输出文件的名称,然后是 idum 的第三行,然后是输入的其余部分(如果有的话)。

假设您的可执行文件是my_program.exe并且您的输入文件(上面提到的三行)是my_input_file.txt,您可以像这样将输入文件重定向到标准输入

%> my_program.exe < my_input_file.txt

于 2015-03-13T23:57:29.410 回答
0

也许对您来说是最简单的解决方案,假设您只有几个简单的 read(*,*),您可以不理会代码,只需将所需的字符串通过管道传输到标准输入

echo "file1\nfile2\n3" | executable

(在 csh 下测试 .. 您可能需要针对不同的外壳进行一些调整)

顺便说一句,错误消息让我认为您已经从标准输入管道而不是终端读取,并且一些先前的读取耗尽了输入。

于 2012-10-05T16:55:38.403 回答