2012-10-03 109 views
0

我是Fortran新手,尝试重新使用一些代码,这些代码是我继承的较大程序的一部分。程序运行时,会提示输出文件名。我宁愿直接在代码中指定这些输出文件名,所以我可以一次并行/全部运行程序(程序的运行时间约为15小时,并且需要运行66个不同的文件,所以我宁愿将它们一次全部运行,而不是一个接一个地运行,因为这需要相当长的时间)。Fortran新输出文件

的代码位,我有看起来像这样的工作:

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 

我检查,我有合适的线路结局。 有什么建议吗?

+0

该错误可能来自其他地方 - 从尝试从文件读取更多文件的代码,而不是文件可以提供的代码。你真的尝试过什么?你有一台拥有66个执行核心的计算机吗?如果不是这样,试图同时运行66个程序可能无法提供您预期的加速。 – IanH

+0

我(认为我)知道错误的原因来自于该代码的一部分,因为它在错误代码之前说“在文件v1.f95的第25行”,并且这部分代码从第24行开始。我有对具有足够节点的计算机集群的访问,所以这就是为什么我想要这个工作。我尝试删除'print'行,并尝试各种重定向读取文件的方式,如下所示:'read(*,'(file.out)')fout'错误始终是相同的,这让我觉得我只是错过了如何指定输出文件的语法。 – mfk534

+0

我也试过把'status = new'作为读命令的一部分,但它不起作用。 – mfk534

回答

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 
/

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

0

也许你最简单可行的解决方案,假设你只有一个 几个简单的读取(*,*)的,你可以独自离开的代码,并简单地管 所需的字符串标准输入

echo "file1\nfile2\n3" | executable 

(在csh测试..你可能需要调整有点为不同的外壳)

错误消息BTW让我觉得你已经从标准输入管道 而非终端殆尽一些之前读读书输入。

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