2012-02-06 42 views
2

我正在從Fortran中的文件中讀取每行具有未確定數量的浮點值(現在,一行中大約有17個值)。我想讀取每行到給定浮點變量的第n個值。我應該如何去做這件事?解析Fortran中的字符串

在C我寫的方式,它是閱讀整個行到字符串,然後做一些這樣的:

for(int il = 0; il < l; il++) 
{ 
    for(int im = -il; im <= il; im++) 
     pch = strtok(NULL, "\t "); 
} 
for(int im = -l; im <= m; im++) 
    pch = strtok(NULL, "\t "); 
dval = atof(pch); 

在這裏,我不斷地閱讀價值和把它扔了(從而縮短字符串),直到我準備好接受我正在嘗試讀取的值。

有什麼辦法可以在Fortran中做到這一點?在Fortran中有更好的方法嗎?我的Fortran代碼的問題似乎是read(tline, '(f10.15)') tline1不縮短tline(tline是我的字符串持有整條線和tline1我想解析它),因此我不能使用與我在我的C例程中相同的方法。

任何幫助?

+0

當然必須有一些圖書館已經爲你做這個?不需要重新發明輪子。 – DNA 2012-02-06 16:04:41

回答

2

問題是Fortran是基於記錄的I/O系統,而C是基於流的。

如果您有權訪問符合Fortran 2003的編譯器(現代版本的gfortran應該可以工作),則可以使用說明符來執行所需的操作。

可以找到一個例子here

當然,如果您確實傾向於使用Fortran,則可以直接使用C函數。連接兩種語言通常很簡單,通常只需要一個小寫名稱和附加下劃線的包裝(當然取決於編譯器和平臺)。通常來回傳遞數組或字符串並不是那麼簡單;但是對於這個不需要的例子。

一旦數據位於字符數組中,您可以像讀取ADVANCE=no簽名那樣將它讀入另一個變量,即。

do i = 1, numberIWant 
    read(tline, '(F10.15)', ADVANCE="no") tline1 
end do 

其中tline應在循環結束時包含您的號碼。

由於基於記錄的I/O,READ語句通常會拋出記錄結束後的內容。但ADVANCE=no告訴它不要。

+0

我看到我可以用流訪問打開一個文件,但我試圖從字符串中讀取這些值。有沒有辦法將字符串視爲流? – drjrm3 2012-02-06 16:18:56

+0

您發佈的文章是從文件中讀取的 - 數據如何從文件讀取到字符串?難道你不能只讀取你想要的文件,或者你需要整個事情,只有在某些時候的部分? – tpg2114 2012-02-06 16:23:14

+0

擴展了從字符串中讀取的答案。 – tpg2114 2012-02-06 16:29:46

0

如果您確切知道想要的值在哪個位置開始,您可以使用T編輯描述符來啓動從該位置開始的下一次讀取。
比方說,每個字段的寬度是10個字符,並且您想要讀取第五個值。 read語句將如下所示。

read(file_unit, '(t41, f10.5)') value1 

P.S:您可以在運行時t後動態創建一個格式字符串,以正確的數量,利用文字變量作爲格式,並使用內部文件寫入到把這個號碼。
假設您想要從位置n開始的值。然後,它會是這個樣子(我的單引號和雙引號之間交替嘗試,使之更加明確每個字符串的啓動和停止):

write(my_format, '(a, i0, a)') "(t", n, ', f10.5)' 
read(file_unit, my_format) value1