Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 运行时错误:文件结束_Fortran_Runtime_Fortran90_Fortran95 - Fatal编程技术网

Fortran 运行时错误:文件结束

Fortran 运行时错误:文件结束,fortran,runtime,fortran90,fortran95,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 configuration

我有一个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.100
fort.119
。但它显示了以下错误

单位=100,文件=fort.100 Fortran运行时错误:文件结束


我哪里做错了

这里需要注意的是文件连接。这里的程序使用两种连接形式:预连接和
open
语句。我们在这里忽略到
datafile.txt
的连接

我们在子例程中看到预连接

write(p,*) x(j),y(j)
单元编号
p
以前未出现在
open
语句中。这就是默认文件名fort.100的来源

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

在子例程之后,我们使用

open(no)
是的,因为我们尚未关闭连接,正在打开一个单元号已连接到文件的连接。这是完全可以接受的。但我们必须理解这意味着什么

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

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

现在,如何解决这个问题

一种方法是重新定位连接。虽然我们可能希望
打开(否,position='rewind')
但我们不能这样做。然而,也有一些问题

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

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

尝试在每个文件的末尾写一个空行。另外,在读取周期中关闭“否”文件。
@MichaelO。
否,它不工作。再次显示相同的错误。那么,您必须对每个文件进行明确的命名,包括读取和写入。