我有一个文本文件,其中包含信息标题,后跟只有数字的行,这些数字是要读取的数据。
我不知道标题中有多少行,而且它是一个可变数字。
以下是一个例子:
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组数据可以跨越某些行,但每组都是矩阵“值”中的一行。
问题是第二个循环不会读取测试循环中读取的最后一行(这是第一行数据)。
一种可能的解决方案是读取测试循环中的行,而不是前进到下一行。我用过这个,提前='不',但它仍然进入下一行,为什么?。
答案 0 :(得分:1)
如果在从文件读取时遇到当前记录的结尾以满足读取语句的输出项列表中的项目,则非前进读取仍会将文件位置设置为在下一条记录开始之前 - 非 - 推进并不意味着“永不推进”#34;您可以将分配给iostat说明符中指定的变量的值用于read语句,以查看是否已达到当前记录的结尾 - 使用IS_IOSTAT_EOR内在函数或针对ISO_FORTRAN_ENV中的等效值进行测试。
(上面隐含的事实是,非推进读取仍然会在与实际读取的项目相对应的文件位置上前进...因此,一旦getTypeOfLine
过程确定它有一行数据,该行的至少一部分已被阅读。除非您重新定位文件,否则数据"读取语句将错过该部分。)