【问题标题】:Fortran; looping over file names with common attributesFortran;循环遍历具有公共属性的文件名
【发布时间】:2014-02-24 22:24:45
【问题描述】:

我是 Fortran 的新手,我的文件名有问题,我在 simuln#.res 中有一堆数据(其中 1

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

【问题讨论】:

  • 我建议在实际使用 Fortran 2003 时不要使用fortran90 标签。

标签: fortran gfortran fortran2003 do-loops


【解决方案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 上强制使用尾随“/”。]

【讨论】:

  • 谢谢!因此,我将文件位置的长度设置为 90,因为这是我最长的路径名的字符串,但随后出现此错误,因为文件位置和文件 A 之间有空格。如果我没记错的话,你可以使用这个 trim(adjust1(fileplace//theFileA))。但我似乎没有将adjust1 作为函数Error: Function 'adjust1' at (1) has no IMPLICIT type。你对我可以使用的东西有其他建议吗?感谢您的帮助。
  • 你在adjustl中使用1而不是L吗?
  • :/ 是的,好的,虽然它似乎没有修剪多余的部分,但现在我得到了/Users/mesmith/Documents/repos/lee-simplified/src/simulnOutput/gas/noCoulomb/ simuln1.res 作为print *, fileplace//theFileA 的印刷品
  • 另外,意思是在最后一条评论中添加这个我还添加了一个缓冲区变量(长度为 90),然后我分配了filepath = trim(adjustl(buffer)),但我认为它应该自动将文件路径分配给正确的修剪长度?
  • @user3346946 在这种简单的情况下,您可能不会从具有两个版本的路径的自动分配中受益。请确保在// 之前使用trim(如果你也喜欢adjustl)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 1970-01-01
  • 2023-01-11
  • 2013-04-11
  • 2013-01-08
  • 2016-05-26
相关资源
最近更新 更多