我对Fortran很新,我的文件名也有问题,我在simuln#.res中有一堆数据(其中1<#< 20),我有多个不同的目录都是一样的simuln#.res名称,但他们有不同的输入参数。代码如下所示:
character(len=11) :: theFileA
character(len=12) :: theFileB
character(len=:), allocatable :: fileplace
write(*,*) "the directory with the data sets, use quotations"
read(*,*) fileplace
fileLoop : do j=1,20
if (j .lt. 10) then
write(theFileA, '("simuln", I1,".res")' ) j
open(newunit= iin,file = fileplace//theFileA,status='old')
else
write(theFileB, '("simuln",I2,".res")') j
open(newunit= iin,file = fileplace//theFileB,status='old')
end if
does some stuff with the file
end do fileLoop
代码在我的mac上使用gfortran编译器进行编译,但是当我放入带有文件的目录的路径时,它会给出错误simuln1.res does not exist
(它绝对会做,三重检查)。我试过改变编辑描述符(并使真实(j)),但我仍然得到相同的东西。
任何人都可以帮助我吗?
答案 0 :(得分:2)
您有fileplace
延迟长度((len=:)
),但在尝试阅读之前似乎没有分配它。
也就是说,read(*,*) fileplace
根据F2003自动分配规则,没有将fileplace
分配给正确的长度并分配。这意味着以后fileplace
很可能被视为要打开的文件中的零长度字符变量(''
)。
要检查此假设,请尝试print *, fileplace//theFileA
。这可以通过错误消息仅引用文件名称的尾部来支持。
如果是这种情况,那么使用" large"变量。你说90个字符只要你需要,所以:
character(len=90) :: fileplace ! Adjust length as desired
...
read(*,*) fileplace
...
open (newunit=iin, file=TRIM(fileplace)//theFileA, status='old')
...
确保将文件的名称附加到修剪过的目录名称,以避免两个部分之间留有空格。
[作为旁注,您似乎不需要theFileA
和theFileB
;考虑到尾随空白被忽略,只使用后者。而你可能想要强制拖尾' /'在fileplace
上。]