2012-10-24 108 views
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 

回答

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 
+0

啊我看。非常感謝。你的解決方案肯定幫了我。 – user1757273

相關問題