0

我有一段 Fortran 代码:

C --------------------------------------------
      CALL READIN_HYD
      CALL READIN_CONFIG
      CALL READIN_FORCE
      CALL READIN_STEPPER
C --------------------------------------------

      OPEN(11,FILE='EVO_0wall.dat')

我正在尝试用我可以从我的输入参数输入的东西(这些都由子程序 readin_hyd 等读取)替换硬编码的文件名(EVO_0wall.dat)。

我正在尝试做这样的事情:

  CHARACTER*30 OUTFILE

  WRITE(*,*) 'OUTPUT FILE'
  READ(*,*)   OUTFILE
  WRITE(*,*) 'OUTPUT FILE: ',OUTFILE

我已将其添加到 READIN_CONFIG 子例程中。回来,我替换为

  OPEN(11,FILE=OUTFILE,STATUS='NEW')

在主例程中,希望如果我输入的输入文件在适当的位置包含“EVO_0wall.dat”(带有撇号),它会说与以前相同的内容。

如果我运行代码,则所有其他输入变量都被正确读取,并且数据被正确输出 - 但是,它会创建输出并将输出放置在一个没有扩展名和损坏字符的奇怪文件中(例如,度数,“{ a} 和 0 )。用 .dat 扩展名重命名文件可以打开它,并且其中的数据是正确的。(编辑:实际上,如果我尝试,变量 OUTFILE 在主函数中时会变为奇数字符简单地打印它的值,所以我猜它不仅仅是 OPEN 语句中的错误语法)

Fortran 是否有某种方法可以处理我在这些字符串之间缺少的字符串?恐怕我是 Fortran 的新手(这是我正在改编的别人的代码),我不太确定我错过了什么。任何帮助将非常感激!

谢谢!

4

3 回答 3

3

作为@MSB 建议的替代方案,您可以使用trimand adjustl,如下所示:

   implicit none
   character*99 :: outf

   outf='outf.outf'

   open(1,file=trim(adjustl(outf)))
   write(1,*)'foobar',42
   close(1)

   end

这里adjustl确保没有前导空格,并trim修剪尾随空格。只要outf变量仅包含合法字符[我建议仅使用基本 ASCII],这应该可以工作。

附带说明一下,如果我添加status='new'open语句中,gfortran 4.4.3如果文件已经存在,它会在运行时(至少)失败。如果你真的想确保现有文件不被覆盖,你需要inquire先。

于 2012-04-05T05:20:27.017 回答
1

这似乎没问题。以下 read 语句应允许您省略撇号:

read (*, '(A)' )  outfile

outfile输出值的“echo”写语句是什么?

于 2012-04-04T02:22:36.887 回答
0

我的 FORTRAN 生锈了,但我认为 {a} 可能代表十六进制 A,或十进制 10,这是一个换行符。这就是您在读取 ​​OUTFILE 名称时会得到的结果。

您可能需要修剪所有空白的 OUTFILE

于 2012-04-04T02:24:54.020 回答