【问题标题】:Fortran90: Scripting of Standard In not working as expectedFortran90:标准输入脚本未按预期工作
【发布时间】:2021-09-18 23:11:39
【问题描述】:

在 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 个连字符)

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

谁能帮忙?

(请轻点——这是我在 SO 上的第一篇文章,而 Fortran 不是我的主要语言......)

【问题讨论】:

  • 如果我理解你的描述是正确的,你的程序期望从stdin读取输入文件的name,而不是文件的内容。试试echo 'input-deck01.par' | myprog.e&lt; 是输入重定向,而不是管道。 ----------------是文件input-deck01.par的第一行吗?
  • 您没有使用正确的管道语法。您的 cmdline 获取文件 input-deck01.par 并发送文件中的所有行,就像在控制台中键入一样。你想要什么(我想到了,现在不能测试)是 echo 'input-deck01.par' | myprog.e
  • 啊,我明白了。是的,文件以“----------”开头。我将第一行更改为一些随机字符串,并且它在错误中重现,因此当我想要输入文件名时它确实在读取内容。尝试建议的实际、正确的管道命令效果很好......谢谢你们!

标签: unix fortran fortran90


【解决方案1】:

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

【讨论】:

  • 好吧,如果你喜欢这个解决方案,你能不能点击“这个答案很有用”按钮。
猜你喜欢
  • 2016-09-07
  • 2015-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多