0

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

2 3
6 6 22
-1 3 0

第一行中的整数是矩阵的维度(不包含在矩阵中)维度下面的行是实际矩阵我正在尝试编写一个程序,将该矩阵存储到二维数组中,但我一直得到一个当我尝试使用嵌套的 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
4

1 回答 1

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
于 2012-10-24T00:33:22.127 回答