Runtime error: End of file
Runtime error: End of file
我有一个包含 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
。但是显示如下错误
unit = 100, file = 'fort.100'
Fortran runtime error: End of file
我哪里错了?
这里感兴趣的是文件连接。这里的程序使用了两种连接形式:preconnection和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'
)以进行读取。
我有一个包含 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
。但是显示如下错误
unit = 100, file = 'fort.100' Fortran runtime error: End of file
我哪里错了?
这里感兴趣的是文件连接。这里的程序使用了两种连接形式:preconnection和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'
)以进行读取。