我才刚刚开始使用Fortran,并编写了一个子例程以将给定文件读取到可分配数组中。为此,我首先打开文件以计算文件中的行数,为数组分配适当的大小,倒带文件,然后再次通读以填充数组。
SUBROUTINE read_file(iunit, inFile, data_arry, ncols)
INTEGER :: nlines = 0
INTEGER :: jj, io, iunit, ncols
CHARACTER(LEN=*) :: inFile
REAL(8), DIMENSION(:,:), ALLOCATABLE :: data_arry
OPEN(UNIT=iunit, FILE=inFile) ! Open the file
! Count the number of lines in the file for array allocation
DO
READ(iunit,*,IOSTAT=io)
IF(io/=0) EXIT
nlines = nlines + 1
ENDDO
WRITE(*,*) nlines ! Debug check
REWIND(iunit) ! Start at the beginning of the file
ALLOCATE(data_arry(nlines,ncols)) ! Allocate necessary space
! fill array
DO jj = 1,nlines
READ(iunit,*) data_arry(jj,:)
ENDDO
CLOSE(iunit)
! Check array
DO ii = 1,nlines
WRITE(*,*) data(ii,:)
ENDDO
END SUBROUTINE read_file
我遇到的问题是,我需要读取多个文件,并且当我多次调用此子例程时,变量nlines
不会像我告诉的那样重置为0。因此,它的值只是前一个文件的行数和新文件的行数的总和,当我执行第二个READ
循环时,我得到文件结尾错误。我可以使用另一个IOSTAT
来解决这个问题,但这对我来说似乎是一个临时的解决方法,我宁愿做对了。再说一次,我是FORTRAN的新手,但据我了解,子例程中的变量是全局变量,因此,如果我没有每次都将nlines
初始化为零,那么出现此问题就很有意义。我尝试将变量作为输入,但遇到有关内存位置的其他错误。我也尝试过使其成为函数而不是子例程,但是问题仍然存在。这可能是一个容易解决的问题,但让我毫无头绪。
我正在读取的两个文件的格式如下。
...
16 0.0454916279274181 0.3572201583376681
17 0.0445905581637566 -0.4022701579639916
18 0.0445905581637566 0.4022701579639916
19 0.0435837245293235 -0.4463660172534641
20 0.0435837245293235 0.4463660172534641
...
和
...
1444.3625975724958, 71.46169492954482
1444.3625975724958, 69.59465868490668
1444.3625975724958, 67.72762244026855
1444.3625975724958, 65.86058619563042
1439.8112383739438, 63.99354995099228
1439.8112383739438, 62.126513706354146
...