[英]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.