【问题标题】:Fortran New Output FileFortran 新输出文件
【发布时间】:2012-10-03 20:39:59
【问题描述】:

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

我检查了我是否有正确的行尾。 有什么建议么?

【问题讨论】:

  • 该错误可能来自其他地方 - 来自试图从文件中读取的内容超出文件所能提供的内容的代码。您实际上尝试过什么?你有66个执行核心的电脑吗?否则,尝试同时运行 66 个程序可能无法达到预期的加速效果。
  • 我(认为我)知道错误来自那部分代码的原因是因为它在错误代码之前说At line 25 of file v1.f95,这部分代码从第24行开始。我有访问具有足够节点的计算机集群,这就是我想让它工作的原因。我已经尝试删除 print 行,并尝试了各种重定向读取文件的方法,如下所示:read(*,'(file.out)') fout 错误总是相同的,这让我觉得我只是遗漏了一些关于如何指定一个输出文件。
  • 我也尝试将status=new 作为读取命令的一部分,但没有成功。
  • 如果您想在代码中直接指定 fout 变量的值(我假设它是字符类型),那么您可以使用的语句类型可能只是 fout = 'file.out' .这以及read 语句的语法和含义是基本的 Fortran,不适合在这里教学。这可能 (?) 不是您想要的 - 每次运行的文件名都相同。因此,请考虑您希望如何指定事物(独立于可能编写的任何代码),然后花一些时间学习可能使您实现所需目标的语言基础知识。
  • 谢谢,伊恩。你对在哪里可以找到一个好的基础起点有什么建议吗?我是Fortran新手,一直在参考(pic.dhe.ibm.com/infocenter/comphelp/v111v131/index.jsp?topic=/…)

标签: fortran


【解决方案1】:

如果我正确理解了这个问题,您希望在运行时将一些输出文件名/其他变量传递给您的程序。这可以通过使用简单的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
/

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

【讨论】:

    【解决方案2】:

    也许对你来说是最简单的解决方案,假设你只有一个 几个简单的读取(*,*),您可以不理会代码并简单地管道 标准输入所需的字符串

    echo "file1\nfile2\n3" | executable
    

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

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

    【讨论】:

      【解决方案3】:

      我认为您的错误来自以下事实:如果没有字符串作为格式说明符,则无法读取 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多