我这里有一个自动获取行数和列数的函数,你自己用。
Integer Function GetDataN( cStr )
Character( Len = * ) , Intent( IN ) :: cStr
Integer :: i
Logical :: bIsSeparator , bIsQuote
GetDataN = 0
bIsSeparator = .TRUE.
bIsQuote = .FALSE.
Do i = 1 , Len_Trim( cStr )
Select Case( cStr(i:i) )
Case( '"' , "'" ) !// 如果遇到引号
If ( .Not.bIsQuote ) GetDataN = GetDataN + 1 !//如果不在引号中,则增加一个数据
bIsQuote = .Not.bIsQuote !// 引号结束或开始
bIsSeparator = .FALSE.
Case( " " , "," , char(9) ) !// 如果遇到分隔符
If ( .Not.bIsQuote ) then !// 分隔符如果不在引号中
bIsSeparator = .TRUE.
End If
Case Default
If ( bIsSeparator ) then
GetDataN = GetDataN + 1
End If
bIsSeparator = .FALSE.
End Select
End Do
End Function GetDataN
Integer Function GetFileN( iFileUnit )
Implicit None
Integer , Intent( IN ) :: iFileUnit
Character*(1) :: cDummy
GetFileN = 0
Rewind( iFileUnit )
Do
Read( iFileUnit , * , End = 999 , Err = 999 ) cDummy
GetFileN = GetFileN + 1
End Do
999 Rewind( iFileUnit )
Return
End Function GetFileN
请注意,每一行的列数可能是不同的。你需要自己对文件有一定的了解,是否有必要每一行都判断一下列数??
关于如何从指定行,指定列读取数据。
比如读第 M 行,第 N 列。则:
Do i = 1 , M - 1
Read( 文件通道号 , * )
End Do !// 也就是跳过 M-1,然后
Read( 文件通道号 , * ) 垃圾数组(1:N-1) , 你要的变量