Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 使用变量在Fortran中打开输出文件_String_Variables_Fortran - Fatal编程技术网

String 使用变量在Fortran中打开输出文件

String 使用变量在Fortran中打开输出文件,string,variables,fortran,String,Variables,Fortran,我有一段Fortran代码: C -------------------------------------------- CALL READIN_HYD CALL READIN_CONFIG CALL READIN_FORCE CALL READIN_STEPPER C -------------------------------------------- OPEN(11,FILE='EVO_0wall.dat') 我正试图用我

我有一段Fortran代码:

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

      OPEN(11,FILE='EVO_0wall.dat')
我正试图用我可以从输入参数输入的东西来替换硬编码文件名(EVO_0wall.dat)(这些都是由readin_hyd等子程序读取的)

我正在尝试这样做:

  CHARACTER*30 OUTFILE

  WRITE(*,*) 'OUTPUT FILE'
  READ(*,*)   OUTFILE
  WRITE(*,*) 'OUTPUT FILE: ',OUTFILE
   implicit none
   character*99 :: outf

   outf='outf.outf'

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

   end
我已经添加到READIN_CONFIG子例程中。回来后,我用

  OPEN(11,FILE=OUTFILE,STATUS='NEW')
在主例程中,希望如果输入文件I pipe在适当的位置包含“EVO_0wall.dat”(带撇号),它会说与以前相同的话

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

Fortran有什么方法可以处理我在这两种语言之间缺少的字符串吗?恐怕我是Fortran的新手(这是我正在改编的其他人的代码),我不太确定我缺少了什么。任何帮助都将不胜感激


谢谢!

看起来还可以。下面的read语句应该允许您省略撇号:

read (*, '(A)' )  outfile

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

似乎可以。下面的read语句应该允许您省略撇号:

read (*, '(A)' )  outfile

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

我的FORTRAN已经过时了,但我认为{a}可能表示十六进制a,或十进制10,这是一个换行符。这是读取outfile名称时得到的结果


您可能需要修剪所有空白的输出文件

我的FORTRAN已经生锈了,但我认为{a}可能代表十六进制a或十进制10,这是一个换行符。这是您在读取输出文件名时得到的结果


您可能需要修剪所有空白的输出文件

作为@M.S.B.建议的替代方案,您可以使用
TRIM
adjustl
,如下所示:

  CHARACTER*30 OUTFILE

  WRITE(*,*) 'OUTPUT FILE'
  READ(*,*)   OUTFILE
  WRITE(*,*) 'OUTPUT FILE: ',OUTFILE
   implicit none
   character*99 :: outf

   outf='outf.outf'

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

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


另一方面,如果我将
status='new'
添加到
open
语句中,它将在运行时失败(至少使用
gfortran 4.4.3
)如果该文件已存在。如果您确实想确保现有文件未被覆盖,则需要先查询。

作为@M.S.B.建议的替代方法,您可以使用
trim
adjustl
,如下所示:

  CHARACTER*30 OUTFILE

  WRITE(*,*) 'OUTPUT FILE'
  READ(*,*)   OUTFILE
  WRITE(*,*) 'OUTPUT FILE: ',OUTFILE
   implicit none
   character*99 :: outf

   outf='outf.outf'

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

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


另一方面,如果我将
status='new'
添加到
open
语句中,它将在运行时失败(至少使用
gfortran 4.4.3
)如果文件已经存在。如果您真的想确保现有文件没有被覆盖,您需要先
查询

如何将您在read_hyd中设置的outfile值恢复到主例程中的outfile版本?很抱歉问一些基本问题,但您知道如果不使用参数列表或模块它们是不同的变量?我的猜测,我强调这是一个猜测,主例程中的outfile是未初始化的。您如何将您在read_hyd中设置的outfile值恢复到主例程中的outfile版本?很抱歉问一些基本问题,但您知道如果不使用一个参数列表或一个模块,它们是不同的变量?我的猜测,我强调这是一个猜测,是主例程中的outfile未初始化