2011-12-12 237 views
2

這應該很簡單,但我無法設法讀入Fortran中的浮點數。我的程序test.f看起來是這樣的:在Fortran中讀取浮點數時出錯

PROGRAM TEST 
    open(UNIT=1,FILE='test.inp') 
    read(1,'(f3.0)')line 

    STOP 
    END 

輸入文件test.inp只包含一個單一的浮動:1.2

現在我testfile的的編譯去罰款,但是當我運行它,我得到一個錯誤:

At line 4 of file test.f (unit = 1, file = 'test.inp')

Fortran runtime error: Expected REAL for item 1 in formatted transfer, got INTEGER

(f3.0)

^

我嘗試不同的代碼修改,也對谷歌搜索的錯誤消息,但沒有結果。任何幫助將不勝感激!

問候, 弗蘭克

+1

雖然這不能回答這個問題,但您應該真正聲明您使用的所有變量的類型。在你的代碼中,你沒有說明'line'的類型。在程序,函數,子程序或模塊的頂部(在任何「use」語句之前)包含'implicit none'行是一個好習慣。隱式類型聲明,這是你用過的,可能會導致很多令人討厭的,很難發現的錯誤。 – Chris

+0

這實際上確實回答了這個問題。 –

回答

5

你的變量line隱含定義作爲整數。這不適用於f編輯描述符。如果要讀取整數,請使用i編輯描述符(例如,i3)。否則,聲明line爲真正的數學「f」描述符。

注意旁邊:.0是沒有問題的,因爲如果Fortran語言得到了一些帶有小數點的描述符.0部分被忽略。只有當輸入了一個沒有小數的數字時,才使用它,然後使用小數點後面的數字在小數點後面加上一個小數點。對於F8.5123456789被讀作123.45678。更多關於這裏http://software.intel.com/sites/products/documentation/hpc/compilerpro/en-us/fortran/lin/compiler_f/lref_for/source_files/pghredf.htm

+0

像'123456789'被讀爲'123.45678'的事情正是我爲什麼要儘量避免指定格式的原因。 –

+0

這的確解決了這個問題,謝謝! – user1094052

1

在你讀的聲明

read(1,'(f3.0)')line 

f3.0告訴旅遊項目小數點後讀3個數字與數字0(這是牛米語法的意思)。所以我認爲該程序正在從文件(不是1.2)讀取1,這是一個整數。嘗試的東西替換該行像

read(1,'(f3.1)')line 

雖然,如果你的文件的數量很可能會改變,會比9.9大或者有一個以上的小數位,你應該增加域寬度的東西大於3。

read intrinsic對閱讀和寫作的Fortran更多信息,文檔和data edit descriptors

編輯:格式指示符,在您的讀statment引號第二個參數,具有形式fw.d,其中f表明要讀出的數據是一個浮點數,w是包括所有字段的寬度空格和小數點以及d指定小數點右側的位數。

+0

當讀取真實數據時,它不會導致運行時錯誤以獲取輸入上沒有小數點的數字。通過這個'read(1,'(f3.1)')'行,Fortran會將'11'讀爲'1.1'。 –

+2

如果項目具有小數點,則「f」描述符的「w」部分在輸入上被覆蓋。這不是問題。 –

+0

@VladimirF好點。格式化描述符以及我嘗試和遠離的東西,但是問題代碼中的「.0」對我來說可能是錯誤的一個可能原因,但是,進一步調查您的答案顯然是這裏的解釋。 @ M.S.B。假設行是一個「真實」,格式描述符「(f1.1)」,「(f2.1)」和「(f3.1)」分別讀取0.1,1.0和1.2,所以'w'部分不會被忽略 - 或者我在這裏錯過了什麼? – Chris

1

我會建議閱讀/寫入列表格式化的數據,除非你有一個很強的理由否則。假設你在從單一線只是一個單一的浮動或整數文件中讀取,這樣

123.45 
11 
42 

那麼這應該做閱讀

real*8 :: x,y,z 
open(1,file=filename) 
read(1,*)x 
read(1,*)y 
read(1,*)z 
close(1) 
+0

大概您的意思是列表引導的格式化,而不是未格式化的格式,而不是未格式化的,俗稱的二進制數據。 – janneb

+0

感謝您指出這一點!編輯我的回答 –