2013-04-07 86 views
1

我創建了一個Fortran 90代碼,用於以csv格式過濾和轉換另一個程序的文本輸出。該文件包含一個包含各種類型(字符,實數,整數)列的表。有一列通常包含十進制值(概率值)。 BUT,在某些行中,值應該是十進制「1.000」,該值實際上是整數「1」。Fortran 90:如何正確讀取其他實數中的整數

我使用「F5.3」說明符來讀取此列,並且我對錶格的每一行都有相同的格式語句。因此,當代碼找到「1」時,它會讀取「.001」,因爲它沒有找到小數點。

我可以用什麼方法正確地(並且一般地)讀取其他小數中的整數? 我可以指定「未格式化」輸入僅用於多個「空格」嗎?

+0

在'fw.d'描述符中很少需要指定非零'd'。 – 2013-04-07 15:25:34

+0

這是最好的答案!我不認爲這是顯而易見的... 請張貼它也作爲答案。 – MakisH 2013-04-07 21:57:36

回答

0

爲浮點格式規範的數據編輯描述fw.d對於通常與零d使用(它不能被中省略)輸入。當浮點數據以縮放整數存儲時,或者您從整數值進行某些單位轉換時,在極少數情況下使用非零d

+0

這裏存在潛在的危險 - w必須大於逗號之間的總字段寬度。如果你的csv碰巧有一個額外的空格或額外的小數的雜散字段,你會讀這個字段的多個(垃圾)值。 (使用f1000.0我猜..) – agentp 2013-04-08 18:00:27

0

您可以嘗試使用列表控制輸入:使用*而不是格式說明符。這將是整個閱讀,而不是選定的項目。或者你可以將字符串讀入一個字符串來測試它們的內容以決定如何讀取它們。如果子字符串有小數點:read (string(M:N), '(F5.3)') value。如果沒有,請使用不同的格式,例如可能讀取爲F5.0

P.S. 「未格式化」是在不轉換的情況下讀取二進制數據...它是從文件到數據項的數據的直接副本。 「列出指導」是Fortran術語,用於讀取&轉換數據而不使用格式規範。

+1

@MakisH如果你需要幫忙拔出那些你應該這麼說的子串,那麼你的問題不清楚,如果你可能已經這麼做了。 ..和讀(字符串(m:n),*)值應該工作得很好。 – agentp 2013-04-07 14:40:15

+0

我認爲這不是一種「優雅」的方式。我還需要其他列中的字符串和值。雖然,非常感謝你的答案! :-D – MakisH 2013-04-07 22:02:01

0

那麼這裏的成才新的對我說:F90允許逗號和空格分隔符的一個簡單的列表的混合控制的讀:

read(unit,*)v1,v2,v3,v4 

與輸入

1.222 2 , 3.14 , 4 

產生

1.222000 2.000000 3.140000 4.000000