回 帖 发 新 帖 刷新版面

主题:求!!fortran如何控制每一行数值读取个数

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个回复)

沙发

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

板凳


多谢石头!!!确实挺强悍!!!

3 楼

强,谢谢
那么如何解决下面的问题呢,数据是存放在记事本里,内容如下:其中的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()
谢谢先!!!

我来回复

您尚未登录,请登录后再回复。点此登录或注册