您知道以下語句是否通過fortran 90/95/2003標準之一保證爲真? 「假設一個字符變量的read語句被賦予一個空行(即只包含空格和新行字符)。如果格式說明符是星號(*),它將繼續讀取後續行,如果格式說明符是'(A)',則將空字符串替換爲字符變量。「Fortran讀取語句讀取超出行尾
例如,請看下面的最小程序和輸入文件。
程序代碼:
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'的第二個讀取語句似乎被賦予第三行,它是空白的,並將空行存儲在'str2'中,而不移動到第四行。
我試着編譯由英特爾Fortran(ifort 12.0.4)和GNU Fortran(gfortran 4.5.0)編寫的程序並得到相同的結果。
關於提問這個問題的背景:我正在寫一個子程序來讀取一個數據文件,它使用空行作爲數據塊的分隔符。我想確保空白行和空白行在讀取數據時被扔掉。我還需要使其符合標準和便攜。
感謝您的幫助。
這是一個非常有用的信息,您從未遇到有關「fmt = *」行爲的特例。謝謝。然而,如果你能證實這裏觀察到的「fmt = *」和「fmt ='(A)」「行爲是標準行爲,例如引用一些文獻,我將非常感激。 – norio
@norio我剛剛編輯了我的答案,您可能正在尋找。另外,在編寫可移植代碼時,可以訪問不同的平臺 - 標準不能保證行爲,只是說明應該是什麼行爲。 – milancurcic
謝謝您引用標準草案。這很清楚。是的,我同意你關於在不同平臺上進行測試的重要性 - 最後,我從實際的機器上得到結果。除此之外,在編寫程序的初始階段,我要注意不要依賴於特定環境的特性而不會注意。 – norio