文件打开时的记录结束错误

时间:2015-09-20 22:08:36

标签: fortran fortran90

我目前正在编写一个代码来模拟粒子碰撞。我试图打开与粒子(N)一样多的文件,然后在时间积分的每个步骤中为每个文件中的位置和速度放置数据(使用欧拉方法,但这不相关)。为此,我尝试使用do循环,因此它将打开我需要的所有文件 - 然后我将所有数据放入其中,稍后使用不同的do循环 - 然后将它们全部关闭。

我首先尝试执行do循环来打开文件 - 但它给出了#34;文件已在另一个单元中打开的错误",所以我做了以下内容:

module parameters
implicit none
character :: posvel
integer :: i, j, N
real :: tmax
real, parameter :: tmin=0.0, pi=3.14159265, k=500.0*10E3, dt=10.0E-5, dx=10.0E-3, g=9.806, ro=1.5*10E3
real, dimension(:), allocatable :: xold, xnew, vold, vnew, m, F, r
end module parameters

PROGRAM Collision
use parameters
implicit none

write(*,*) 'Enter total number of particles (integer number):'
read(*,*) N

allocate(xold(N))
allocate(vold(N))
allocate(xnew(N))
allocate(vnew(N))
allocate(m(N))
allocate(F(N))
allocate(r(N))

xold(1) = 0.0
vold(1) = 0.0
m(1) = 6.283*10E-9
r(1) = 10E-4

xold(2) = 5.0
vold(2) = 0.0
m(2) = 6.283*10E-9
r(2) = 10E-4

write(*,*) 'Type total time elapsed for the simulation(real number):'
read(*,*) tmax

do i = 1, N
    write(posvel,"(a,i3.3,a)") "posveldata",i,".txt"
    open(unit=i,file=posvel, status="unknown")
end do

do i = 1, N
    close(unit=i)
end do

END PROGRAM Collision

最后十行是关于我的问题的。

这在codeblocks中起作用 - 它只打开了我需要的文件数量,但我实际上正在使用gfortran并且它给了我和#34;记录结束"写声明中的错误。

如何让它正确执行并提供我需要的N个不同文件?

P.S。:这不是编译问题,而是在我执行程序之后。

1 个答案:

答案 0 :(得分:3)

参数模块中的字符串只有1个字符长度,因此不能包含完整的文件名。所以请使用更长的字符串,例如

character(100) :: posvel

然后您可以将每个文件打开为

do i = 1, N
    write(posvel,"(a,i0,a)") "posveldata",i,".txt"
    open(unit=i,file=trim(posvel), status="unknown")
end do

这里,我使用格式i0自动确定整数的正确宽度,并使用trim()来删除文件名中不必要的空格(尽管它们可能没有必要)。写声明也可以更紧凑地编写为

write(posvel,"('posveldata',i0,'.txt')") i

将字符文字嵌入格式规范中。

错误消息"记录结束"来自上述问题。这可以通过以下代码确认

character c

write(c,"(a)") "1"
print *, "c = ", c
write(c,"(a)") "23"   !! line 8 in test.f90
print *, "c = ", c

gfortran给出了

c = 1
At line 8 of file test.f90
Fortran runtime error: End of record

这意味着虽然c用作内部文件,但此"文件"没有足够的空间容纳两个角色(这里" 23")。为了比较,ifort14给出了

c = 1
forrtl: severe (66): output statement overflows record, unit -5, file Internal Formatted Write

而Oracle Fortran12提供

c = 1
******  FORTRAN RUN-TIME SYSTEM  ******
Error 1010:  record too long
Location:  the WRITE statement at line 8 of "test.f90"
Aborted

(有趣的是,Oracle Fortran报告记录为"太长",可能引用输入字符串。)