Fortran code error: Fortran runtime error: End of file
Fortran code error: Fortran runtime error: End of file
我一直在尝试 运行 以降序排列数组的代码。该数组是从输入文件中获取的,然后排列到输出文件中。代码编译正常,但是当 i 运行 a.exe 时显示错误。
这是代码:
program arrangingARRAY
dimension a(100)
open(1,file="array.txt")
read(1,*) n
do i =1, n
read(1,*) a(i)
enddo
close(1)
i=1
1 continue
j=i+1
2 continue
if (a(j).lt.a(i)) then
goto 3
else
s=a(i)
a(i)=a(j)
a(j)=s
end i
3 continue
j=j+1
if (j.le.n) then
goto 2
else
i=i+1
end if
if (i.lt.n) then
goto 1
end if
open(1,file="decreasingARRAY.txt")
do i=1,n
write(1,*) a(i)
enddo
end
输入文件如下所示:
60
123
60
21
1
2
3
4
11
90
我试过把空行放到txt文件里,但是不行。如果您对此问题有任何解决方案,请提供帮助。
您的代码甚至无法编译。但我认为 end i
行是一个错字。但更重要的是,您正在从输入文件中读取行数 n
而输入文件不包含行数,或者如果包含,则它是错误的 (60)。代码中有 10 行。因此,要么将 10 添加到代码的第一行,要么在代码中修复 n = 10
以解决问题。此外,避免使用编号行和 goto
语句。这样的句法属于半个世纪以前,属于打卡时代。在每个程序单元的开头使用 implicit none
。下面修复了问题和代码的一些语法问题。
program arrangingARRAY
implicit none
real :: Array(100), s
integer :: fileUnit, numLine, i, j
open(newunit = fileUnit,file = "array.txt")
!read(fileUnit,*) numLine
numLine = 10
do i =1, numLine
read(fileUnit,*) Array(i)
enddo
close(fileUnit)
i=1
1 continue
j = i + 1
2 continue
if (Array(j) >= Array(i)) then
s = Array(i)
Array(i) = Array(j)
Array(j) = s
end if
j = j + 1
if (j <= numLine) then
goto 2
else
i = i + 1
end if
if (i < numLine) then
goto 1
end if
open(1,file="decreasingARRAY.txt")
do i=1,numLine
write(1,*) Array(i)
enddo
end
这是输出(与您的输入相同),
123.0000
90.00000
60.00000
60.00000
21.00000
11.00000
4.000000
3.000000
2.000000
1.000000
我认为数据是 integer
类型的,您必须读取文件直到文件末尾才能确定它们有多少。为此,请使用 中描述的方法。在您的代码中,您使用第一个数字来决定读取多少个数字,这看起来是不正确的。
此外,看起来您正在编写 Fortran 77 代码,既然您正在学习,您不妨使用带有 do/end do
循环的现代 Fortan
试试这个:
program SortSO
use, intrinsic :: iso_fortran_env, only : iostat_end
implicit none
integer :: i, j, n, lu, ierr
integer :: a(100), t
i = 0
! Read values until end of file
open(newunit = lu, file="array.txt")
do
i = i + 1
read (lu, *, iostat=ierr) a(i)
if( ierr == iostat_end ) then
n = i - 1
exit
end if
end do
close(lu)
! Sort values
do i=1,n-1
do j=i+1,n
if( a(i)<a(j) ) then
t = a(j)
a(j) = a(i)
a(i) = t
end if
end do
end do
! Export values
open(newunit = lu, file="output.txt")
do i=1,n
write (lu,*) a(i)
end do
close(lu)
end program SortSO
含output.txt
含
123
90
60
60
21
11
4
3
2
1
我一直在尝试 运行 以降序排列数组的代码。该数组是从输入文件中获取的,然后排列到输出文件中。代码编译正常,但是当 i 运行 a.exe 时显示错误。 这是代码:
program arrangingARRAY
dimension a(100)
open(1,file="array.txt")
read(1,*) n
do i =1, n
read(1,*) a(i)
enddo
close(1)
i=1
1 continue
j=i+1
2 continue
if (a(j).lt.a(i)) then
goto 3
else
s=a(i)
a(i)=a(j)
a(j)=s
end i
3 continue
j=j+1
if (j.le.n) then
goto 2
else
i=i+1
end if
if (i.lt.n) then
goto 1
end if
open(1,file="decreasingARRAY.txt")
do i=1,n
write(1,*) a(i)
enddo
end
输入文件如下所示:
60
123
60
21
1
2
3
4
11
90
我试过把空行放到txt文件里,但是不行。如果您对此问题有任何解决方案,请提供帮助。
您的代码甚至无法编译。但我认为 end i
行是一个错字。但更重要的是,您正在从输入文件中读取行数 n
而输入文件不包含行数,或者如果包含,则它是错误的 (60)。代码中有 10 行。因此,要么将 10 添加到代码的第一行,要么在代码中修复 n = 10
以解决问题。此外,避免使用编号行和 goto
语句。这样的句法属于半个世纪以前,属于打卡时代。在每个程序单元的开头使用 implicit none
。下面修复了问题和代码的一些语法问题。
program arrangingARRAY
implicit none
real :: Array(100), s
integer :: fileUnit, numLine, i, j
open(newunit = fileUnit,file = "array.txt")
!read(fileUnit,*) numLine
numLine = 10
do i =1, numLine
read(fileUnit,*) Array(i)
enddo
close(fileUnit)
i=1
1 continue
j = i + 1
2 continue
if (Array(j) >= Array(i)) then
s = Array(i)
Array(i) = Array(j)
Array(j) = s
end if
j = j + 1
if (j <= numLine) then
goto 2
else
i = i + 1
end if
if (i < numLine) then
goto 1
end if
open(1,file="decreasingARRAY.txt")
do i=1,numLine
write(1,*) Array(i)
enddo
end
这是输出(与您的输入相同),
123.0000
90.00000
60.00000
60.00000
21.00000
11.00000
4.000000
3.000000
2.000000
1.000000
我认为数据是 integer
类型的,您必须读取文件直到文件末尾才能确定它们有多少。为此,请使用
此外,看起来您正在编写 Fortran 77 代码,既然您正在学习,您不妨使用带有 do/end do
循环的现代 Fortan
试试这个:
program SortSO
use, intrinsic :: iso_fortran_env, only : iostat_end
implicit none
integer :: i, j, n, lu, ierr
integer :: a(100), t
i = 0
! Read values until end of file
open(newunit = lu, file="array.txt")
do
i = i + 1
read (lu, *, iostat=ierr) a(i)
if( ierr == iostat_end ) then
n = i - 1
exit
end if
end do
close(lu)
! Sort values
do i=1,n-1
do j=i+1,n
if( a(i)<a(j) ) then
t = a(j)
a(j) = a(i)
a(i) = t
end if
end do
end do
! Export values
open(newunit = lu, file="output.txt")
do i=1,n
write (lu,*) a(i)
end do
close(lu)
end program SortSO
含output.txt
含
123
90
60
60
21
11
4
3
2
1