簡體   English   中英

在FORTRAN中讀取可變長度數據

[英]Reading variable length data in FORTRAN

我有一個無法更改格式的輸入文件。 特別是其中一行可以包含6或7個實數,而我沒有任何提前知道的方法。

經過一番閱讀之后,我對列表格式的read語句的理解是,如果我嘗試在包含6的行中讀取7個實數,它將嘗試從下一行進行讀取。 該代碼的作者說,編寫該代碼時,它將讀取6個實數,然后將第7個默認值設置為0。我假設他依賴於某些編譯器特定的行為,因為在任何地方都找不到該行為的提及。

我使用gfortran作為編譯器,是否可以指定這種行為? 還是有一種很好的方法來計算一條線上的輸入數量並倒回然后選擇讀取正確的數量?

這是實現這一目標的小技巧

 character*100 line
 real array(7)
 read(unit,'(a)')line  !read whole line as string'
 line=trim(line)//' 0' !add a zero to the string
 read(line,*)array  !list read

如果輸入行只有6個值,則零現在是第七個。 如果一開始有七個,它將什么都不做。

我盡量避免在輸入中使用格式說明符。

當嘗試讀取只有7個值的7個值時,也許應該使用IOSTAT語句檢測錯誤的格式。並且應該使用ADVANCE語句重試讀取同一行。

READ(LU,'7(F10.3)', IOSTAT=iError, ADVANCE='NO') MyArray(1:7)
IF(iError > 0) THEN
    ! Error when trying to read 7 values => try to read 6 !
    READ(LU, '6(F10.3)') MyArray(1:6)
ELSEIF(iError == 0) THEN
    READ(LU, *) ! For skipping the line read with success with 7 values
ENDIF

例如,當您到達文件末尾時,IOSTAT取負值;對於讀取問題(通常為格式錯誤),取值為IOSTAT;對於讀取成功而言,取值為0。 有關gfortran錯誤代碼的完整定義,請參見此鏈接: http : //www.hep.manchester.ac.uk/u/samt/misc/gfortran_errors.html

另一種方法是將行作為字符串讀取並處理該字符串以獲得矢量值:

CHARACTER(LEN=1000) :: sLine
...
READ(LU, '(A)') sLine
READ(sLine,'7(F10.3)', IOSTAT=iError) MyArray(1:7)
IF(iError > 0) THEN
    ! Error when trying to read 7 values => try to read 6 !
    READ(sLine, '6(F10.3)') MyArray(1:6)
ENDIF

如果以固定格式寫入值,則可以通過測試行的長度來確定向量的長度:

CHARACTER(LEN=1000) :: sLine
INTEGER :: nbValues
CHARACTER(LEN=2) :: sNbValues
...
READ(LU, '(A)') sLine
nbValues = LEN_TRIM(sLine) / 10 ! If format is like '(F10.x)'
WRITE(sNbValues, '(I2)') nbValues
READ(sLine, '('//TRIM(sNbValues)//'(F10.3))') MyArray(1:nbValues)

暫無
暫無

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

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