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