在Fortran子程序中读取多个文件
我有一个Fortran子程序,在主程序中被调用多次(我没有访问权限)。在我的子例程中,我希望在每次迭代中根据输入参数从几个(~10^4)文件中的一个读取数据。每个文件都有一行数据;我的数据格式如下:在Fortran子程序中读取多个文件,fortran,Fortran,我有一个Fortran子程序,在主程序中被调用多次(我没有访问权限)。在我的子例程中,我希望在每次迭代中根据输入参数从几个(~10^4)文件中的一个读取数据。每个文件都有一行数据;我的数据格式如下: 0.97014199999999995 0.24253600000000000 0.0000000000000000 我使用以下代码行打开和读取文件: program test_read implicit none inte
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,而用于读取命令的IOSTAT对于某些文件是0,对于某些文件是1,对于其他文件是29!我查找了错误代码29的含义,了解到它可能表示在路径中找不到该文件。但文件肯定在那里李>
- 而且,我看不出它无法读取的文件有什么不同。事实上,我甚至看到同一个文件给出的IOSTAT值为0和29李>
- 需要注意的是,我正在几个内核上运行主程序。这可能与错误有关吗
action='read'
如果您正在运行一个多线程程序,那么不同的线程可能同时在不同的文件上执行IO。。。每个线程应使用不同的单元号以避免冲突。我猜您使用的是固定格式的源代码,因此请注意代码的格式(您可能只想再缩进四列)。我的建议是使用
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显示的代码中没有隐含的形状声明<代码>字符(*)是假定的长度声明。该语法是有效的Fortran 90。我更担心的是,他可能只是从一个进程中打开了太多文件,并且超过了操作系统对打开文件的限制。代码显示文件正在关闭,因此每个进程的文件数可能不是问题。因此,结果表明,不同的线程试图根据同一文件的单元号访问该文件。我通过使用一个可变单元号来解决这个问题,该单元号是输入的函数(I
,在上面的代码中)。