主题:求!!fortran如何控制每一行数值读取个数
esccool
[专家分:0] 发布于 2012-02-27 10:56:00
1 21 43 55
2 23 67 89 99
3 67 89 24 78
4 2 4 78 每行个数不确定(均为4个的或者5个的),如何用fortran控制输出
输出格式变为均为5个数字的形式,某一行为4个时将第4个数字重复变为第五个,若该行为5个数字,则直接输出。注意前提是很多行(不知道每一行的具体数字个数是4个还是5个),希望有fortran高手能告知如何解决???
回复列表 (共3个回复)
沙发
臭石头雪球 [专家分:23030] 发布于 2012-02-27 11:35:00
Program Main
Implicit None
Character(Len=512) :: cStr
Integer :: iData( 5 ) , iN , iStatus , GetDataN
Open(12,File='yourfile')
Do
Read( 12 , '(a512)' , ioStat = iStatus ) cStr
if( iStatus /= 0 ) Exit
iN = GetDataN( cStr )
If ( iN <=5 ) then
Read( cStr , * ) iData(1:iN)
If ( iN < 5 ) then
iData(iN+1:5) = iData(iN)
End If
Write(*,*) iData(:)
End If
End Do
Close(12)
End Program Main
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
板凳
esccool [专家分:0] 发布于 2012-02-27 12:27:00
多谢石头!!!确实挺强悍!!!
3 楼
jyj2014 [专家分:0] 发布于 2014-08-18 18:55:54
强,谢谢
那么如何解决下面的问题呢,数据是存放在记事本里,内容如下:其中的5*5表示有5个数值“5”,如这一行:“5*5 5 6 8 6”表示:5 5 5 5 5 5 6 8 6,其它类推。
aaa
1 2 3 5 8 9
5*5 5 6 8 6
5 5 5 6 2*5 /
kkk
1 2 3 5 8 9
1 2 3 5 8 9
5*5 5 6 8 6
5 5 5 6 2*5 /
现在想把以上记事本中的每个数据读取出来并赋值给数组a(),及数组k()
谢谢先!!!
我来回复