有一个不知道维数的数组存在a.txt中,如何编写fortran程序计算数组维数
1个回答
展开全部
数据在文件中并没有维度的概念。
同样是 100 个数据,你可以认为是 1维的,有100个元素。也可以认为是二维数组,10*10的,还可以认为是三维数组,10*5*2的。
维度是人为划分的。
如果你说的是大小,你想知道一个数据文件中有多少个数据。那么请给出文件的范例。是成列的,还是成块的?每一行是否是固定的大小?
同样是 100 个数据,你可以认为是 1维的,有100个元素。也可以认为是二维数组,10*10的,还可以认为是三维数组,10*5*2的。
维度是人为划分的。
如果你说的是大小,你想知道一个数据文件中有多少个数据。那么请给出文件的范例。是成列的,还是成块的?每一行是否是固定的大小?
追问
假设数据文件是由5行100列组成,如何确定5和100?、事先并不知道
追答
我这里有两个函数,自己写的。分别用来确定行数(GetFileN )列数(GetDataN)
如果你确定每一行都有相同的列,那么 GetDataN 只调用一次就可以了,否则每一行都要调用。(因为每一行的列数不同)
使用 GetDataN 时,先用
character(512) :: cStr
read( 文件号 , '(a512)' ) cStr
把某一行读成字符串。然后:
列数 = GetDataN( cStr )
获得该行的列数。
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
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询