主题:求助个问题
jonnie
[专家分:40] 发布于 2011-02-28 21:55:00
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个回复)
沙发
jonnie [专家分:40] 发布于 2011-03-01 10:43:00
咋就么有一个人回啊,各位大神们,帮帮忙吧
板凳
yeg001 [专家分:14390] 发布于 2011-03-01 11:59:00
如果知道详细的格式规律, 用格式读取, 再考虑求和.
如果格式不清楚就字符串读取, 判读之后用内部文件读取提取信息. 再相加.
3 楼
jonnie [专家分:40] 发布于 2011-03-01 15:23:00
能不能写一小段程序出来额,在我有X和Y的这些有用的行里是有固定格式的,其他对我都没用,我想读文件时写个循环,一个一个读下去,最开始来个判断语句,是就读出后面的数,但是这不是需要两个读文件的操作么,就是循环外读一次循环内一次,好像这个行不通。
4 楼
臭石头雪球 [专家分:23030] 发布于 2011-03-02 09:13:00
以下程序有两个假设:
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 楼
yeg001 [专家分:14390] 发布于 2011-03-02 09:50:00
这些问题最好自己学习了一下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 楼
yeg001 [专家分:14390] 发布于 2011-03-02 09:50:00
早知道雪球写代码我就不献丑了~~
7 楼
jonnie [专家分:40] 发布于 2011-03-02 18:43:00
非常感谢上面的两位朋友哈,解决了大麻烦,不胜感激
我来回复