回 帖 发 新 帖 刷新版面

主题:求助个问题

xxxxsskskssk
skjfsjfsjf
x=9,y=10,sljfsl
sfdslsfjlsfkjd
x=3,y=5,sjfosjos
sjdsofskjfksj
sjfdosudojos
sjdosjosufdpwo
x=6,y=13,ajdsdlsm
加入我某个文件里的数据像上面一样,我需要的数据时其中x的和以及y的和,咋做才比较方便,谢谢了[em4]

回复列表 (共7个回复)

沙发

咋就么有一个人回啊,各位大神们,帮帮忙吧

板凳

如果知道详细的格式规律, 用格式读取, 再考虑求和.
如果格式不清楚就字符串读取, 判读之后用内部文件读取提取信息. 再相加.

3 楼


能不能写一小段程序出来额,在我有X和Y的这些有用的行里是有固定格式的,其他对我都没用,我想读文件时写个循环,一个一个读下去,最开始来个判断语句,是就读出后面的数,但是这不是需要两个读文件的操作么,就是循环外读一次循环内一次,好像这个行不通。

4 楼

以下程序有两个假设:
1. x= 和 y= 后面始终有一个逗号
2. 每一行最多只有一个 x= 和 y=

Program OlidStone
  Implicit None
  Character(Len=512) :: cStr
  Real :: rXSum = 0.0 , rYSum = 0.0 , rTemp
  Open(12,File='a.txt')
  Do
    Read(12,'(a512)',end=999) cStr
    rTemp = FindRealInStr( cStr , "x=" , "," )
    rXSum = rXSum + rTemp
    rTemp = FindRealInStr( cStr , "y=" , "," )
    rYSum = rYSum + rTemp
  End Do
999  write(*,*) rXSum , rYSum
     Close(12)

Contains
  Real Function FindRealInStr( cStr , cPrefix , cPostfix )
    Implicit None
    Character( Len = * ) , Intent( IN ) :: cStr , cPrefix , cPostfix
    Integer :: iPre , iPost
    FindRealInStr = 0.0
    iPre = index( cStr , cPrefix ) + Len_Trim( cPrefix )
    if ( iPre > Len_Trim(cPrefix) ) then
      iPost = iPre + index( cStr(iPre:) , cPostfix )
      if ( iPost > iPre ) then
        read( cStr(iPre:iPost) , * , err = 999 ) FindRealInStr
      end if
    end if
    return
999 FindRealInStr = 0.0    
  End Function FindRealInStr

End Program

5 楼

这些问题最好自己学习了一下fortran还是想不出来再根据别人提供的思路去尝试一下的. 既然我回帖了而又不太麻烦就写个代码吧...
code:

!***************************************
program readxy_plus

implicit none
character(len=256) :: a_line
integer :: error, i, j, flagx, flagy
integer :: markx1, markx2, marky1, marky2
integer :: x, y, z

flagx = -1
flagy = -1
open(unit=84, file="temp.txt")
do
  read(unit=84, fmt="(A256)", iostat=error) a_line
  if(error/=0) exit
  do i=1, 256
    if((a_line(i:i)=='x') .and. (flagx/=0)) then
      markx1=i+2
      flagx=0
      do j=i+1, 256
        if(a_line(j:j)==',') then
          markx2 = j-1
          exit
        endif
      enddo
    endif
    if((a_line(i:i)=='y') .and. (flagy/=0)) then
      marky1=i+2
      flagy=0
      do j=i+1, 256
        if(a_line(j:j)==',') then
          marky2 = j-1
          exit
        endif
      enddo
    endif
  enddo
  if((flagx==0) .and. (flagy==0)) then
    read(a_line(markx1:markx2), fmt="(I5)") x
    read(a_line(marky1:marky2), fmt="(I5)") y
    z = x+y
    write(*, *) 'x+y=', z
  endif
  flagx=-1
  flagy=-1
enddo

end program readxy_plus
!***********************************

temp.txt 文件存放楼顶的文件内容:
xxxxsskskssk
skjfsjfsjf
x=9,y=10,sljfsl
sfdslsfjlsfkjd
x=3,y=5,sjfosjos
sjdsofskjfksj
sjfdosudojos
sjdosjosufdpwo
x=6,y=13,ajdsdlsm

cvf下运行结果:
 x+y=          19
 x+y=           8
 x+y=          19
Press any key to continue

注意: 虽然尽量写得有一点适应性, 但是里面有好几处地方是没有设置检验的, 例如我默认了x出现必定x后两位才开始是数字, 数字之后一定有个逗号等等. 如果环境变了自己变通吧.

6 楼

早知道雪球写代码我就不献丑了~~

7 楼

非常感谢上面的两位朋友哈,解决了大麻烦,不胜感激

我来回复

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