2012-10-23 52 views
0

我正在做一個化學研究項目,目前在名爲Connectivity-M.txt的文件中有一個378 x 378的零和一個矩陣。我正在嘗試編寫一個簡單的程序來讀取矩陣的每一列,並查找值爲1的條目。由於矩陣的格式爲A(i,j),我想要編寫i,j位置,以找到每個值爲一個新文件Wires.txt的位置。這是我到目前爲止的代碼:如何讀取矩陣並將某些值寫入fortran90中的新文件

program connectivity_matrixread 

IMPLICIT none 
integer :: i , j 
INTEGER, DIMENSION(378,378) :: A 

open(unit = 1 , file = "Connectivity-M.txt") 
open(unit = 2 , file = "Wires.txt") 

! Read values 
do i = 1 , 378 
    do j = 1 , 378 


     Read(1,*) A(i,j) 

     if (A(i,j) .eq. 1) then 
      write(2,*) i , j 
     endif 

    enddo 
enddo 

end program connectivity_matrixread 

的程序管理來讀取第一列那裏是隻有值1。單個條目它寫出這個條目的ij位置,但否則我得到一個錯誤,讀取:

At line 25 of file conn-read.f90 (unit = 1, file = 'Connectivity-M.txt')
Fortran runtime error: End of file

移動打開文件語句後,我仍然收到相同的錯誤。錯誤引用的行包含read語句。對不起,我對Fortran和堆棧溢出都很陌生,我非常感謝幫助。

+4

花幾分鐘時間熟悉SO,以及如何最好地在這裏提出問題。特別是,瞭解如何將代碼段格式化爲代碼;看到文本編輯框上方的小圖標,尤其是看起來像「{}」的圖標。我和很多Fortran程序員一樣,太老,脾氣暴躁,無法幫助那些不盡如人意的人。 –

回答

3

取決於你的輸入文件的內容以及如何打開它的佈局,你也許可以在一行中讀它,像這樣:

read(1,*) A 

,讓Fortran語言採取的細節。如果你的數組按照行的順序存儲,我期望這個快速簡單的方法會以'錯誤'的順序讀取它,所以你可能想在讀取數組後轉置數組。或者你可能需要閱讀它逐行而不是像這樣的:如果有整數的文件和行權數量的每一行權數量

do ix = 1,nrows 
    read(1,*) A(ix,:) 
end do 

這些方法纔有效。

當我在寫,請教幾個沒有提出的位:

  • 不要進入你的程序中使用個位數的單位標識符的習慣。當你的程序啓動時,已經在使用0,5和6以外的其他標識符是很不尋常的,但並非完全不可能。如果您有一個(非常)最新的編譯器,請在您的OPEN語句中使用選項NEWUNIT=UNIT,如果不使用至少有2位數的數字。
  • 現在是21世紀,你可以放棄陳舊的.eq.並使用==;看起來像Fortran 95和後來已經獲得認可。

並回答你的問題:是的,錯誤語句引用錯誤發生時正在執行的源代碼行。意外的文件結束最可能的原因是文件不在程序正在查找的位置(Fortran認爲不存在的文件與空文件幾乎相同)或文件包含的數據較少比你試圖從中讀取。後一個錯誤的原因可能是文件包含的數據比您想象的要少,或者您的讀取語句嘗試讀取的內容比您認爲的要多。如果沒有看到輸入文件,我無法分辨出是哪種情況。不管你做什麼都不要發佈你的整個輸入文件,但是如果你仍然有問題發佈它的一個片段。

要在試圖打開文件之前檢查文件是否存在,請使用inquire語句。

我很懷疑你還沒弄清楚因爲你寫了什麼而發生了什麼該程序設法讀取第一列,而你的代碼很清楚地讀取了數組中的值row-by -行。

2

它可能需要在這之後更多的調整,但第一步是移動的公開聲明後,環上面,像這樣:

open(unit = 1 , file = "Connectivity-M.txt") 

do i = 1 , 378 

    do j = 1 , 378 

的原因是,該文件只能用一次打開,然後你遍歷它。

發佈您的結果,我們將看到接下來會發生什麼。

+0

重要提示:請關注High Performance Mark的評論。學習Stack Overflow是如何實現通信平滑的,這是個好主意。其實,你可以編輯你的問題並在那裏更新你的代碼。選擇代碼部分並點擊{}按鈕。原來如此;大!看@Chris做了什麼。 –

+0

我不確定我是否正確發佈,但我更新了上面的代碼。有沒有涉及的邏輯有瑕疵? –

+0

現在,最有可能的就是關於輸入文件。我相信閱讀(1,*)A(i,j)期望每行一個數字。很可能,事實並非如此。每一行實際包含什麼? –

相關問題