好吧,我有一个看起来像这样的文件:
2 3
6 6 22
-1 3 0
第一行中的整数是矩阵的维数(不包括在矩阵中) 尺寸下方的行是实际矩阵 我正在尝试编写一个程序,将此矩阵存储到2D数组中,但当我尝试使用嵌套的do循环读取矩阵时,我不断收到运行时错误。它一直说“fortran运行时错误:文件结束”这里是我的代码
PROGRAM addsub
IMPLICIT NONE
CHARACTER(30)::file1
INTEGER:: i,j,err1
INTEGER, DIMENSION(1)::dim1r,dim1c
REAL, ALLOCATABLE:: array1(:,:)
WRITE(*,101) "What is the first filename?"
READ(*,*) file1
OPEN (UNIT=11, FILE=file1, STATUS="OLD", ACTION="READ", IOSTAT=err1)
IF (err1 .NE. 0) THEN
WRITE(*,'(2A)')"There was an error opening ", file1
STOP
END IF
DO i=1,1,1
READ(11,*)dim1r(1),dim1c(1)
END DO
ALLOCATE(array1(dim1r(1),dim1c(1)))
REWIND(11)
DO i=1,dim1r(1),1
DO j=1,dim1c(1),1
READ(11,*) array1(i,j)
END DO
END DO
END PROGRAM addsub
答案 0 :(得分:1)
主要问题是每个READ
语句都试图读取单独的一行;因此,您尝试阅读6行,而您的文件并没有那么多。
有几种解决方法:
您可以尝试使用advance='no'
一次读取每个数字,但这意味着您无法使用列表导向的输入,并且需要明确使用格式:
DO i=1,dim1r
DO j=1,dim1c-1
READ(11,FMT='(F2.0)',advance='no') array1(i,j)
PRINT *, array1(i,j)
END DO
READ(11,FMT='(F2.0)') array1(i,dim1c)
END DO
您可以使用隐含的do循环一次读取整行:
DO i=1,dim1r
READ(11,*) (array1(i,j),j=1,dim1c)
END DO
或者只是通过给它数组切片来阅读它:
DO i=1,dim1r
READ(11,*) array1(i,1:dim1c)
END DO
请注意另外几件事 - dim1c
和dim1r
不必是数组;并且您在阅读标题后不应该REWIND
,否则您将作为数据读取标题。
因此,完整的工作版本如下所示:
PROGRAM addsub
IMPLICIT NONE
CHARACTER(30)::file1
INTEGER:: i,err1
INTEGER ::dim1r,dim1c
REAL, ALLOCATABLE:: array1(:,:)
PRINT *, "What is the first filename?"
READ(*,*) file1
OPEN (UNIT=11, FILE=file1, STATUS="OLD", ACTION="READ", IOSTAT=err1)
IF (err1 .NE. 0) THEN
WRITE(*,'(2A)')"There was an error opening ", file1
STOP
END IF
DO i=1,1,1
READ(11,*)dim1r, dim1c
END DO
ALLOCATE(array1(dim1r,dim1c))
DO i=1,dim1r
READ(11,*) array1(i,1:dim1c)
END DO
DO i=1,dim1r
PRINT *, array1(i,:)
END DO
DEALLOCATE(array1)
END PROGRAM addsub