Fortran新输出文件

Fortran新输出文件,fortran,Fortran,我是Fortran新手,正在尝试重新利用一些代码,这些代码是我继承的更大程序的一部分。程序运行时,会提示输入输出文件名。我更愿意在代码中直接指定这些输出文件名,这样我就可以并行/一次性运行程序(程序的运行时间大约为15小时,需要为66个不同的文件运行,因此我更愿意一次性运行它们,而不是一个接一个地运行,因为这需要相当长的时间) 我正在使用的代码如下所示: 24 print *,'Enter output filename' 25 read(*,*) fout 26 print *,'Ent

我是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
我已经检查过我的行尾是否正确。
有什么建议吗

如果我理解正确,您希望在运行时将大量输出文件名/其他变量传递给您的程序。这可以通过使用一个简单的输入文件来处理,并将这个文件传递给程序。例如,代码如下所示:

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
/

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

如果我正确理解了这个问题,您希望在运行时将多个输出文件名/其他变量传递给您的程序。这可以通过使用一个简单的输入文件来处理,并将这个文件传递给程序。例如,代码如下所示:

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
/

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

假设您只有一个 很少有简单的read(*,*)可以让代码单独使用,只需管道 标准输入所需的字符串

echo "file1\nfile2\n3" | executable
(在csh下测试..您可能需要为不同的shell调整一点)

顺便说一句,错误消息使我认为您已经在从标准DIN管道读取数据
而不是一个终端和一些先前的读取耗尽了输入。

假设您只有一个 很少有简单的read(*,*)可以让代码单独使用,只需管道 标准输入所需的字符串

echo "file1\nfile2\n3" | executable
(在csh下测试..您可能需要为不同的shell调整一点)

顺便说一句,错误消息使我认为您已经在从标准DIN管道读取数据
而不是一个终端和一些先前的读取耗尽了输入。

我认为您的错误来自这样一个事实,即如果没有字符串作为格式说明符,就无法读取fout。在第25行(和其他阅读中)尝试此选项

read(*,”(a)fout

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

字符fout(25)
.
.
.
读取(*,‘(a25)’fout

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

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


%>my_program.exe

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

read(*,”(a)fout

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

字符fout(25)
.
.
.
读取(*,‘(a25)’fout

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

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


%>my_program.exe

该错误可能来自其他地方,即试图从文件中读取的内容超过文件所能提供的内容的代码。你到底试过什么?你有66个执行核的电脑吗?如果不是,尝试同时运行66个程序可能不会给您预期的速度。我(认为我)知道错误来自该部分代码的原因是,文件v1.f95的第25行在错误代码之前显示
,而这部分代码从第24行开始。我可以访问一个有足够节点的计算机集群,所以这就是我想让它工作的原因。我已尝试删除
打印
行,并尝试了各种重定向读取文件的方法,例如:
read(*,'(file.out)')fout
错误始终是相同的,这让我觉得我只是缺少了一些关于如何指定输出文件的语法。我还尝试将
status=new
作为read命令的一部分,但没有起作用。如果您想直接指定
fout
变量的值(我假设该变量为字符类型)在代码中,您可以