如何将矩阵存储到2D数组中?

时间:2012-10-24 00:03:15

标签: multidimensional-array matrix fortran runtime-error eof

好吧,我有一个看起来像这样的文件:

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

1 个答案:

答案 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

请注意另外几件事 - dim1cdim1r不必是数组;并且您在阅读标题后不应该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