簡體   English   中英

Fortran讀取語句超出了行尾

[英]Fortran read statement reading beyond an end of line

你知道以下聲明是否可以通過fortran 90/95/2003標准之一保證真實嗎? “假設一個字符變量的read語句被賦予一個空行(即只包含空格和換行符號)。如果格式說明符是星號(*),它繼續讀取后續行,直到非空白如果格式說明符為'(A)',則將空字符串替換為字符變量。“

例如,請查看以下最小程序和輸入文件。

程序代碼:

PROGRAM chk_read
  INTEGER,         PARAMETER :: MAXLEN=30
  CHARACTER(len=MAXLEN)      :: str1, str2

  str1='minomonta'
  read(*,*)     str1
  write(*,'(3A)')  'str1_start|', str1, '|str1_end'

  str2='minomonta'
  read(*,'(A)') str2
  write(*,'(3A)')  'str2_start|', str2, '|str2_end'

END PROGRAM chk_read

輸入文件:

----'input.dat' content is below this line----

yamanakako

kawaguchiko    
----'input.dat' content is above this line----

請注意,'input.dat'中有四行,第一行和第三行是空白的(僅包含空格和換行符)。 如果我運行程序為

$ ../chk_read < input.dat > output.dat 

我得到以下輸出

----'output.dat' content is below this line----
str1_start|yamanakako                    |str1_end
str2_start|                              |str2_end
----'output.dat' content is above this line----

變量'str1'的第一個讀取語句似乎是查看'input.dat'的第一行,找到一個空行,移到第二行,找到字符值'yamanakako',並將其存儲在'str1'中”。

相反,變量'str2'的第二個read語句似乎給出了第三行,它是空白的,並將空行存儲在'str2'中,而不是移到第四行。

我嘗試用英特爾Fortran(ifort 12.0.4)和GNU Fortran(gfortran 4.5.0)編譯程序並得到相同的結果。

稍微討論一下這個問題的背景:我正在編寫一個子程序來讀取一個使用空行作為數據塊分隔符的數據文件。 我想確保在讀取數據時丟棄空白行,只留下空白行。 我還需要使其標准符合和便攜。

謝謝你的幫助。

來自Fortran 2008標准草案:

列表定向輸入/輸出允許根據列表項的類型而不是格式規范進行數據編輯。 它還允許數據為自由字段,即用逗號(或分號)或空格分隔。

然后:

一個或多個列表定向記錄中的字符構成值和值分隔符的序列。 記錄的結尾與空白字符具有相同的效果,除非它在字符常量內。 任何兩個或多個連續空白的序列都被視為單個空白,除非它在字符常量內。

這隱含地表明,在列表導向的輸入中,空行被視為空白,直到下一個非空值。

在讀取時使用fmt ='(A)'格式描述符時,空行被讀入str。 另一方面,fmt = *表示自由格式的列表導向I / O,它會跳過空白行,直到找到非空字符串。 要測試這個,請執行以下操作:

PROGRAM chk_read
INTEGER :: cnt
INTEGER,         PARAMETER :: MAXLEN=30
CHARACTER(len=MAXLEN)      :: str

cnt=1
do
  read(*,fmt='(A)',end=100)str
  write(*,'(I1,3A)')cnt,' str_start|', str, '|str_end'
  cnt=cnt+1
enddo
100 continue

END PROGRAM chk_read

$ cat input.dat



yamanakako

kawaguchiko

EOF

運行程序給出了這個輸出:

$ a.out < input.dat 
1 str_start|                              |str_end
2 str_start|                              |str_end
3 str_start|                              |str_end
4 str_start|yamanakako                    |str_end
5 str_start|                              |str_end
6 str_start|kawaguchiko                   |str_end

另一方面,如果您使用默認輸入:

read(*,fmt=*,end=100)str

你最終得到這個輸出:

$ a.out < input.dat 
1 str1_start|yamanakako                    |str1_end
2 str2_start|kawaguchiko                   |str2_end

F2008標准草案的這部分內容可能會解決您的問題:

10.10.3列表導向輸入

7當下一個有效項屬於字符類型時,輸入表單由零個或多個rep-char的可能分隔的序列組成,其類型參數由有效項的類型隱含。 字符序列可以從一個記錄的末尾繼續到下一個記錄的開頭,但記錄的結尾不應出現在撇號分隔的字符序列中的雙撇號之間,也不應出現在引號分隔的字符中的雙引號之間。序列。 記錄的結尾不會導致空白或任何其他字符成為字符序列的一部分。 可以根據需要在盡可能多的記錄上繼續字符序列。 字符空白,逗號,分號和斜杠可能會出現在默認,ASCII或ISO 10646字符序列中。

暫無
暫無

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

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