Fortran90:Standard In 的脚本没有按预期工作

问题描述

在 Unix 中使用 Fortran90...

我有一个程序需要从文件input-deck.par”中读取输入参数。这个文件名目前是硬编码的,但我想使用不同的输入文件input-deck01.parinput-deck02.parinput-deck03.par 等)运行多次运行,所以我已经设置代码执行简单的“read(*,*) inpfile”,允许用户在运行时直接输入此文件名称,以便稍后编写脚本。

这可以很好地交互。如果我执行它要求输入文件名的程序,您输入它并接受文件名,打开文件,程序从该文件获取参数。

问题在于编写此脚本。我尝试使用“<”管道命令编写脚本,因此:

myprog.e < input-deck01.par

但我收到一条错误消息:

Fortran runtime error: Cannot open file '----------------': No such file or directory

如果我在输入行之后打印文件名,它会打印文件名是 '----------------'(我将变量初始化为 16 个字符,因此我认为是 16 个连字符)

似乎“<”管道没有正确传递键盘输入。我试过在文件名周围使用空格和引号(各种组合),但错误是一样的。

有人可以帮忙吗?

(请保持温和——这是我在 SO 上的第一篇文章,Fortran 不是我的主要语言......)

解决方法

Fortran 能够读取命令行参数。一个简单的例子是

program foo

  implicit none

  character(len=80) name
  logical available
  integer fd

  if (command_argument_count() == 1) then
     call get_command_argument(1,name)
  else
     call usage
  end if

  inquire(file=name,exist=available)
  if (.not. available) then
     call usage
  end if

  open(newunit=fd,file=name,status='old')

  ! Read file

  contains
     subroutine usage
        write(*,'(A)') 'Usage: foo filename'
        write(*,'(A)') '       filename --> file containing input info'
        stop
     end subroutine usage
end program foo

您只需将文件导入可执行文件即可

% foo input.txt