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