【发布时间】:2016-12-23 11:36:12
【问题描述】:
我有一个在主程序中多次调用的 Fortran 子例程(我无权访问)。在我的子例程中,我希望根据输入参数在每次迭代中从几个(~10^4)文件之一中读取数据。每个文件都有一行数据;我的数据格式如下:
0.97014199999999995 0.24253600000000000 0.0000000000000000
我正在使用以下代码行来打开和读取文件:
program test_read
implicit none
integer :: i, iopen_status, iread_status
real :: gb
CHARACTER(len=25) :: filename
CHARACTER(*), PARAMETER :: fileplace =
& "/home/ajax/hexmesh_readn/G3/"
dimension gb(3)
i = 5
WRITE(filename,'(a,I0,a)')'GBn_',i,'.txt'
open(unit=15,
& file=fileplace//filename,IOSTAT=iopen_status)
read (15,*,IOSTAT=iread_status) gb
print *,"gb",gb(1),gb(2),gb(3)
close(15)
end program test_read
- 在主程序中,i 是一个变量,但我有一个包含 i 的所有可能值的文件。
- 现在,当我在本地计算机上运行时,这段代码运行良好。但是,当我将它与主程序一起提交时,它的行为有些奇怪。具体来说,它读取一些文件,但不读取其他文件。
- 当我打印出用于打开和读取的 IOSTAT 时,我看到所有文件的打开 IOSTAT 为 0,而对于读取命令,一些文件为 0,一些文件为 -1,其他文件为 29!我查看了错误代码 29 的含义,我了解到它可能表明在路径中找不到该文件。但是文件肯定在那里。
- 另外,我看不出它无法读取的文件有什么不同。事实上,我什至看到同一个文件给出 0 和 29 的 IOSTAT 值!
- 需要注意的一点是,我在多个内核上运行主程序。这可能与错误有关吗?
【问题讨论】:
-
我猜你使用的是固定格式的源代码,所以请注意代码的格式(你可能只是想再缩进四列)。我的建议 elsewhere 使用
iomsg=说明符(并在使用iostat=时检查 iostat 值)适用于此。 -
看起来
iomsg仅在 Fortran 2003 及更高版本中可用,但我使用的是 Fortran 90。另外,你的意思是我应该缩进 4 列?在第一列之前? -
用
iomsg=,试试吧。它可能不适用于您的编译器,但目前流行使用的只有 Fortran 90 的编译器很少(并且没有更多的 Fortran 2003 编译器)。值得注意的是,您在问题中的代码不是 Fortran 90。 -
@francescalus 是对的!您的代码甚至不符合 Fortran 2003。 Fortran 2008 中引入了隐含形状声明;因此 `CHARACTER(*), PARAMETER :: fileplace = & "/home/ajax/hexmesh_readn/G3/" 不是有效的 Fortran 90 但完全合法的 Fortran 2008+。
-
@jlokimlin 显示的代码中没有隐含的形状声明。
CHARACTER(*)是一个假定的长度声明。该语法在 Fortran 90 中有效。
标签: fortran