【问题标题】:Looping over variable file names [duplicate]循环变量文件名[重复]
【发布时间】:2013-04-23 20:44:45
【问题描述】:

我正在使用 Fortran 对拆分为多个文件的庞大数据集进行计算。文件的名称是:

maltoLyo12per-reimage-set1.traj
maltoLyo12per-reimage-set2.traj
maltoLyo12per-reimage-set3.traj

我编写的计算代码如下:

fileLoop: do j = 31, 34

 OPEN(unit=31,status='old',file=fileplace//'maltoLyo12per-reimage-set1.traj')
 OPEN(unit=32,status='old',file=fileplace//'maltoLyo12per-reimage-set2.traj')
 OPEN(unit=33,status='old',file=fileplace//'maltoLyo12per-reimage-set3.traj')
 OPEN(unit=34,status='old',file=fileplace//'maltoLyo12per-reimage-set4.traj')

 ... operation....

close (j)
end do fileLoop

在运行期间,我希望代码一次打开每个文件并在完成计算后关闭它们。但是上面的代码会一次打开所有文件,计算完成后一个接一个地关闭。

所以我尝试修改如下代码:

fileLoop: do j = 31, 34

 OPEN(unit=j,status='old',file=fileplace//'maltoLyo12per-reimage-set1.traj')

close (j)
end do fileLoop

但是在这里我遇到了文件名的问题。每次循环运行时,文件名都不会因为文件名中的短语“set1”而改变。我希望文件名中的数字更改为 set1、set2、set3 等,随后文件单元编号为 31、32、33、34 等。

【问题讨论】:

标签: fortran fortran90


【解决方案1】:

类似这样的:(编辑为单元编号为 31 到 34,文件名为 1 到 4。)

character (len=90) :: filename

fileLoop: do j = 31, 34

 write (filename, '( "maltoLyo12per-reimage-set", I1, ".traj" )' )  j - 30
 OPEN(unit=j,status='old',file=filename)

close (j)
end do fileLoop

【讨论】:

  • 虽然单元号是 31 到 34,但文件名是“set1”,...“set4”,所以写入应该是“write () j-30”。
  • 感谢您的帮助。但是如果集合中的数字超过 9,我会收到错误消息。例如,如果数字变为“set10”,则程序停止运行。如何修复此错误。非常感谢您的帮助。
  • 如果我使用 I2,我会得到诸如 maltoLyo12per-reimage-set10.traj、maltoLyo12per-reimage-set 9.traj 之类的文件名。这是“set”和“.traj”之间的空白。有没有办法解决这个问题?
  • 你可以使用 I2.2,它总是输出两位数,必要时添加前导零。
  • 或者您可以使用i*,它将始终为整数中的所有数字生成一个足够宽的字段,不多也不少。如果您希望 file2.xtn 位于 file10.xtn 之前,则在使用文件系统实用程序对文件名进行排序时,这种方法可能会让您失望。
猜你喜欢
  • 2019-07-05
  • 2017-12-14
  • 1970-01-01
  • 1970-01-01
  • 2020-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-16
相关资源
最近更新 更多