Input Fortran不提前读取文本文件

Input Fortran不提前读取文本文件,input,fortran,gfortran,Input,Fortran,Gfortran,我有一个文本文件,它有一个信息头,后面是一行数字,这些数字就是要读取的数据 我不知道标题中有多少行,它是一个可变的数字 以下是一个例子: filehandle: 65536 total # scientific data sets: 1 file description: This file contains a Northern Hemisphere polar stereographic map of snow and ice coverage a

我有一个文本文件,它有一个信息头,后面是一行数字,这些数字就是要读取的数据

我不知道标题中有多少行,它是一个可变的数字

以下是一个例子:

filehandle:                65536
total # scientific data sets:        1
file description:
This file contains a Northern Hemisphere polar stereographic map of snow and ice coverage at 1024x1024 resolution.  The map was produced using the NOAA/NESDIS Interactive MultisensorSnow and Ice Mapping System (IMS) developed under the directionof the Interactive Processing Branch (IPB) of the Satellite Services Division (SSD).  For more information, contact:  Mr. Bruce Ramsay at bramsay@ssd.wwb.noaa.gov.

Data Set #       1
Data Label:                          
Northern Hemisphere 1024x1024 Snow & Ice Chart
Coordinate System:                   Polar Stereographic
Data Type:                           BYTE
Format:                              I3
Dimensions:                                  1024        1024
Min/Max Values:                         0 165
Units:                               8-bit Flag
Dimension #       0
  Dim Label:                         Longitude
  Dim Format:                        Device Coordinates
  Dim Units:                         Pixels
Dimension #       1
  Dim Label:                         Latitude
  Dim Format:                        Device Coordinates
  Dim Units:                         Pixels
1    0    0    0    0    0    0    0    0    0    0    0    0    0    0
 0
2    0    0    0    0    0    0    0    0    0    0    0    0    0    0
 0
3    0    0    0    0    0    0    0    0    0    0    0    0    0    0
 0
0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
 0
0    0    0    0    0    0    0    0    0    0    0    0    0    0    0
 0

我使用以下方法打开文件:

open(newunit=U, file = ValFile, STATUS = 'OLD', ACCESS = 'SEQUENTIAL', ACTION = 'READ')
然后,我逐行读取文件并测试行的类型:标题行或数据行:

ios = 0
do while ( .NOT. is_iostat_end(ios)   )
    read(U, '(A)', iostat = ios, advance = 'NO') line ! Shouldn't advance to next line
    if (is_iostat_end(ios)) stop "End of file reached before data section."
    tol = getTypeOfLine(line, nValues) ! nValues = 1024, needed to test if line is data.
    if ( tol > 0 ) then   ! If the line holds data.
        exit    ! Exits the loop
    else
        read(U, '(A)', iostat = ios, advance = 'YES') line ! We advance to the next line
    end if
end do
但是循环中的第一个读取总是前进到下一行,这是一个问题

退出上述循环后,输入新循环以读取数据:

read(U, '(1024I1)', iostat = ios) Values(c,:)
1024组数据可以跨越一些行,但每组都是矩阵“值”中的一行

问题在于,第二个循环没有读取测试循环中读取的最后一行(即第一行数据)


一个可能的解决方案是读取测试循环中的行,而不前进到下一行。我使用了advance='no',但它仍然前进到下一行,为什么?

如果在读取文件以满足read语句的输出项列表中的项时遇到当前记录的结尾,则非前进读取仍会将文件位置设置为下一条记录开始之前-非前进并不意味着“永不前进”。您可以使用iostat说明符中为read语句指定的变量所指定的值来查看是否达到当前记录的结尾-使用IS_iostat_EOR内在值或根据ISO_FORTRAN_ENV中的等效值进行测试


(上面隐含的事实是,非前进读取仍然前进到与实际读取的项目相对应的文件位置上……因此,
getTypeOfLine
过程一旦确定它有一行数据,至少该行的一部分已经被读取。除非重新定位文件后续的“数据”“读取语句将丢失该部分。)

如果在读取文件以满足读取语句的输出项列表中的项时遇到当前记录的结尾,则非前进读取仍会将文件位置设置为下一条记录开始之前-非前进并不意味着“从不前进”。您可以使用为read语句的iostat说明符中指定的变量指定的值来查看是否达到了当前记录的结尾-使用IS_iostat_EOR内部变量或根据ISO_FORTRAN_ENV中的等效值进行测试


(上面隐含的事实是,非前进读取仍然前进到与实际读取的项目相对应的文件位置上……因此,
getTypeOfLine
过程一旦确定它有一行数据,至少该行的一部分已经被读取。除非重新定位文件,否则后续的“数据”read语句将忽略该部分。)

文件是什么样子的?显示实际代码,进行非前进读取。我不喜欢backspace命令,但是在这里,在第一次循环读取header之后,它可能会很有帮助。您可以更简单地将每一行作为字符串读取,并在内部读取数据行。显示文件看起来像什么?显示实际代码,这是非前进读取。我不喜欢backspace命令,但是在这里,在第一个循环读取标题之后,它可能会很有帮助。你可以更简单地将每一行作为字符串读取,并在内部读取数据行。但是,我认为,每次我执行一个
read(U),(a)',iostat=ios,advance='NO')行时,它都会读取该行,因此,根据你所说,它将始终前进到下一条记录(行),而不考虑选项
advance='NO'
。这是真的吗?。如果是,这意味着
advance='NO'
read
语句id est中根本不起作用,这是完全无用的。或者,在
read
语句中是否存在此选项有效的情况?否,除非它到达记录的末尾,否则它不会前进。如果您从记录中读取一个包含10个字符的单个字符(即
字符(1)::ch;read(unit,“(a)”,ADVANCE='NO')ch
)(假设它是
ABCDEFGHIJ
,则需要十次读取才能到达记录的末尾(第一个ch将是
a
,然后是
B
,然后是
C
,…)。提前读取的区别在于,每次读取后,即使记录中仍有未读取的字符,提前读取也会提前到下一条记录。好的,我现在明白了。因此,任何读取都会提前一个字段,但不总是一条记录。只有当
提前='yes'
时,任何读取都会提前一条记录。如果
advance='NO'
,只有在读取记录的所有字段时,记录才会被提升。是的,类似于这样,对于“字段”的某些适当定义。尽管从内部文件读取(即从字符变量读取)是一个例外-在这种情况下,每次从变量读取时,都会从头开始。但这是一个单独的前进方向。但我认为每次执行一个
read(U),(a)”,iostat=ios,ADVANCE='NO')行
,它都会读取该行,因此,根据您所说的,它总是前进到下一条记录(行),不管选项是什么,
advance='NO'
。这是真的吗?。如果是,这意味着
advance='NO'
read
语句中根本不起作用,id est,它是完全无用的。或者,在
read
语句中是否存在此选项起作用的情况?不,除非它到达记录。如果您从一条记录中读取一个字符(即
字符(1)::ch;读取(单位,“(a)”,ADVANCE='NO')ch
),其中包含10个字符(假设它是
ABCDEFGHIJ
),则需要十次读取才能到达记录的末尾(第一个ch将是
a
,然后是
B
,然后是
C
,…).提前阅读的区别在于