运行时错误:文件结束

时间:2016-11-27 05:50:54

标签: fortran runtime fortran90 fortran95

我有一个84480行的数据文件,我将它们分成20个不同的文件,每个子程序有4224行。现在我想在另一个子例程中逐个使用这些文件并进行一些分析。但是当我尝试时,我收到运行时错误:文件结束。

这是主程序的结构

real (kind = 8) :: x(84480),y(84480),x1(4424),y1(4424)
open(1000,file='datafile.txt',status='old') 
n = 20          ! number of configurations
m = 84480       ! total number of lines in all configurations  
p = 4224        ! number of lines in a single configuration
no = 100        ! starting file number configurations
do i=1,m
     read(1000,*) x(i),y(i)
end do  
call split(x,y,m,n)
do i = 1,20
    open(no)
    do j = 1,p
        read(no,*) x1(j),y1(j)    ! error is occurring in here
    end do
    no = no + 1
end do
end 

这是子程序

subroutine split(x,y,m,n)
integer , intent (in) :: m,n
real (kind = 8) , intent(in) :: x(m),y(m)
integer :: i,k,j,p
p = 100
do i=0,n-1
    k = i*4224
    do j = k+1,k+4224
        write(p,*) x(j),y(j)
    end do
    p = p + 1   
end do
end subroutine split

此子例程正确地生成输出文件fort.100fort.119。但它显示以下错误

  

unit = 100,file ='fort.100'   Fortran运行时错误:文件结束

我哪里错了?

1 个答案:

答案 0 :(得分:1)

这里感兴趣的是文件连接。此处的程序使用两种形式的连接:预连接open语句。我们忽略了此处datafile.txt的连接。

我们在

子程序中看到预连接
write(p,*) x(j),y(j)

其中单位编号p以前没有在open语句中。这是默认文件名fort.100(等)的来源。

在子程序被调用之后,这20个预连接单元都已写入数据。每个连接都位于文件的末尾。这是值得注意的部分。

在子程序之后,我们用

进入循环
open(no)
我们是,因为我们还没有关闭连接,打开一个已经连接到文件的单元号的连接。这是完全可以接受的。但我们必须明白这意味着什么。

语句open(no)没有文件说明符,这意味着该单元保持连接到之前连接的文件。由于没有给出其他说明符,因此关于连接的任何内容都没有改变。特别是,连接没有重新定位:我们仍然在每个文件的末尾。

所以,来看看,当我们定位在它的末尾时,我们正试图从文件中读取。结果:文件结束错误。

现在,如何解决这个问题?

一种方法是重新定位连接。虽然我们可能希望open(no, position='rewind')我们无法做到这一点。然而,有

rewind no  ! An unfortunate unit number name; could also be rewind(no).

或者,正如对问题的评论中所建议的那样,我们可以关闭每个连接,并在循环中重新打开(使用明确的position='rewind')进行阅读。