我有一段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
我已将其添加到READIN_CONFIG子例程中。回来后,我用
替换 OPEN(11,FILE=OUTFILE,STATUS='NEW')
在主例程中希望如果输入文件I pipe in包含'EVO_0wall.dat'(带撇号)在适当的位置,它会说出与之前相同的东西。
如果我运行代码,所有其他输入变量都被正确读取,并且数据输出正确 - 但是,它创建并将输出放在一个奇数文件中,没有扩展名和一个名称的破碎字符(例如,度使用.dat扩展名重命名文件让我打开它,并且其中的数据是正确的。(编辑:实际上,变量OUTFILE在主函数中变为奇数字符时,如果我试着简单地打印它的值,那么我猜它不仅仅是OPEN语句中的错误语法)
FORTRAN是否有某种方法可以处理这些字符串之间缺少的字符串?我担心我是FORTRAN的新手(这是我正在调整的其他人的代码),并且我不太确定我缺少什么。任何帮助将不胜感激!
谢谢!
答案 0 :(得分:2)
作为@ M.S.B。的建议的替代方案,您可以使用trim
和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
。
答案 1 :(得分:1)
那似乎没问题。以下read语句应该允许您省略撇号:
read (*, '(A)' ) outfile
outfile输出值的“echo”写入语句是什么?
答案 2 :(得分:0)
我的FORTRAN生锈了,但我认为{a}可能代表十六进制A或十进制10,这是一个换行符。这就是你在OUTFILE名称中读到的内容。
您可能需要修剪所有空格的OUTFILE