簡體   English   中英

在fortran中讀取可變長度的實數值

[英]Reading variable length real values in fortran

我有一個帶有以下文本的文件:

-1.065211      246.0638 xlo xhi
-0.615       245.385 ylo yhi
-10 10 zlo zhi

我想將線上的數值讀入3 * 2的實數矩陣中。
是否可以只讀取一條記錄的兩個輸入並轉到下一行? 就像是:
read(1,'(2F?.?/)') (matrix(i,1:2),i=1,3)
我在F中加了問號? 因為我的數字長度是可變的。 換句話說,我只需要閱讀自由格式的記錄中的兩項。 我了解您可以循環執行此操作。 我想知道一個優雅的一線客是否可行。

您可以用實現的目標

do i = 1, 3
   read(fd,*) matrix(i,:)
end do

假定fd已連接到包含您的數據的文件。

@Steve答案中的代碼是可以完成您想要的最簡單的代碼。 如果您希望將其放在一行中 ,則只需

do i=1,3 ; read(fd,*) matrix(i,:) ; end do

如果您要尋找的是僅用一條語句 讀取一條記錄的兩個輸入並轉到下一行”的方法,就我所知,這是不可能的:由於您的實際值具有不同的格式,因此您需要使用列表導向的輸入(格式中的星號)以讀取具有相同語句的多行(所有其他格式的實數都需要輸入正寬度,並且由於您的實數具有不同的寬度,因此會產生任何寬度規范)在運行時錯誤中)。

如果您只想使用一條語句,則需要明確告知程序讀取每行末尾的兩個字符串,即使它們已被丟棄(否則程序將嘗試將字符串轉換為實數,並且這將導致運行時錯誤):

character(len=10) :: r
read(1,*) (a(i,:),r,r,i=1,3)

它不如@Steve的代碼通用(要求每行恰好有2個字符串),並且實際上需要字符變量的附加聲明。

最后,請注意,您不是按元素順序讀取數組:在Fortran中,數組在內存中的元素順序為a(1,1)a(2,1)a(3,1)a(1,2)等。如果您計划操作的實際數組大得多,則索引的順序可能會極大地影響性能,因為連續的內存訪問可能會尋址內存的遠處而不是連續的部分它。 在用Fortran編寫程序時,就像使用其他任何語言(可能使用不同的順序)一樣,您需要考慮數組索引的順序。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM