String 使用变量在Fortran中打开输出文件
我有一段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') 我正试图用我
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未初始化