1

我对 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)),但我仍然得到同样的东西。谁能帮我?

4

1 回答 1

2

您有fileplace延迟长度 ( (len=:)),但您似乎在尝试读取之前没有分配它。

也就是说read(*,*) fileplace,在F2003的自动分配规则下,不会分配fileplace到正确的长度并分配。这意味着稍后fileplace很可能在要打开的文件中被视为零长度字符变量 ( '')。

要检查这个假设,请尝试print *, fileplace//theFileA. 错误消息仅指文件名的尾随部分这一事实可以支持这一点。

如果是这种情况,则使用“大”变量。你说 90 个字符只要你需要,所以:

character(len=90) :: fileplace    ! Adjust length as desired
...
read(*,*) fileplace
...
open (newunit=iin, file=TRIM(fileplace)//theFileA, status='old')
...

确保将文件名附加到修剪后的目录名,以避免两个部分之间有空格。

[作为旁注,您似乎不需要theFileAand theFileB; 考虑到尾随空格被忽略,请使用后者。而且您可能希望在 . 上强制使用尾随 '/' fileplace。]

于 2014-02-24T23:40:27.383 回答