Fortran新输出文件

时间:2012-10-03 20:39:59

标签: fortran

我是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

我已经检查过我有正确的行结尾。 有什么建议?

3 个答案:

答案 0 :(得分:3)

如果我正确理解了这个问题,你想在运行时将许多输出文件名/其他变量传递给你的程序。这可以通过使用简单的namelist输入文件并将此单个文件传递给程序来处理。代码看起来像,例如:

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
/

名单文件很容易处理。他们不关心条目的顺序,记录长度或评论。您可以省略名单列表文件中的任何变量(它们的值不会被修改),或在单个文件中包含多个名称列表(即使是同名)。

答案 1 :(得分:0)

也许是最简单的解决方案,假设你只有一个 几个简单的阅读(*,*)' s你可以单独留下代码并简单地管道 标准输入所需的字符串

echo "file1\nfile2\n3" | executable

(在csh下测试..你可能需要为不同的shell调整一下)

错误消息BTW让我觉得你已经从stdin管道读取了 而不是终端和一些先前的读取耗尽了输入。

答案 2 :(得分: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