Fortran语言; 遍历具有公共属性的文件名(Fortran; looping over fi

2019-09-29 03:25发布

我是相当新的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)),但我仍然得到同样的事情。 谁能帮我?

Answer 1:

你有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')
...

确保你的文件的名称追加到修剪目录名,以避免两个部分之间的空间。

[作为一个侧面说明,你似乎并不需要theFileAtheFileB ; 只用了后,考虑到尾随空白将被忽略。 你可能想迫使末尾的“/” fileplace ]



文章来源: Fortran; looping over file names with common attributes