在FORTRAN中读取可变长度数据

时间:2016-12-21 02:04:35

标签: fortran gfortran

我有一个输入文件,我无法改变格式。其中一条线路可能包含6或7个实数,我没有任何提前知道的方法。

经过一些阅读后,我对列表格式化读取语句的理解是,如果我尝试在包含6的行上读取7个实数,它将尝试从下一行读取。该代码的作者说,当它被写入时,它将读取6个实数,然后将第7个默认为0.我假设他依赖于某些编译器特定的行为,因为我无法在任何地方找到这种行为。

我使用gfortran作为我的编译器,有没有办法指定这种行为?或者有一种很好的方法来计算一行上的一些输入并倒回然后选择读取正确的数字?

2 个答案:

答案 0 :(得分:4)

这是完成该任务的一个小技巧

 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个值,那么零现在是第七个。 如果有七个开始它将无能为力。

我尽量避免在输入上使用格式说明符。

答案 1 :(得分:2)

当您只有6时尝试读取7个值时,可能应该使用class Renters < ActiveRecord::Base def self.search(query) like_query = "%#{query}%" renters = Renters.where("id LIKE ? OR license_no LIKE ?", like_query, like_query) end end 语句来检测错误的格式。您应该使用IOSTAT语句来重试读取同一条线。

ADVANCE

IOSTAT采用负值,例如当您到达文件末尾时,读取问题(通常是格式化错误)为正,读取成功时为0。有关gfortran错误代码的完整定义,请参阅此链接:http://www.hep.manchester.ac.uk/u/samt/misc/gfortran_errors.html

另一种方法是将行读作字符串并操纵字符串以获取向量值:

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

如果值以固定格式写入,您可以通过测试行的长度来确定向量的长度:

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