主题:请教一个很古怪的读写问题
GuiltyOne
[专家分:60] 发布于 2012-09-07 09:18:00
数据如下:
AH ANQ 714 30.583 117.022 75
AH BEB 67 32.90550 117.2974 49.00000
AH BZY 4973 31.39860 116.2164 240.0000
我读取的方式为:
character*5 nam
real*8 weid,jingd,gaod
do while(.not.eof(11))
read(11,'(4x,a5,9x,f8.5,3x,f9.5,3x,f9.3)')nam,weid,jingd,gaod
write(12,'(a5,2x,f8.5,2x,f9.5,2x,f9.3)')nam,weid,jingd,gaod
enddo
得到的结果为:
ANQ 30.58300 117.02200 0.075
BEB 32.90550 117.29740 49.000
BZY 31.39860 116.21640 240.000
问题:同样是浮点数据,为什么第一行的75活生生的就变成了0.075了,而其他的数据却没有问题?
回复列表 (共26个回复)
沙发
臭石头雪球 [专家分:23030] 发布于 2012-09-07 09:25:00
通常,我不推荐用格式化 read,尽量用 * 自由读取。
定义一个 dummy 变量,读取你不需要的列,然后不输出就可以了。
character*5 nam , dummy
real*8 weid,jingd,gaod
do while(.not.eof(11))
read(11,*) dummy , nam , dummy , weid,jingd,gaod
write(12,"(a5,2x,f8.5,2x,f9.5,2x,f9.3)" )nam,weid,jingd,gaod
enddo
板凳
GuiltyOne [专家分:60] 发布于 2012-09-07 09:41:00
谢谢石头兄,有你的帮助实在是太好了![em12]
3 楼
GuiltyOne [专家分:60] 发布于 2012-09-07 09:48:00
补充问一下石头兄,格式化read有什么不妥之处么?
4 楼
臭石头雪球 [专家分:23030] 发布于 2012-09-07 10:40:00
1.麻烦
2.通用性不强。多一个,少一个空格就读不了。
5 楼
leilfm [专家分:160] 发布于 2012-09-10 15:14:00
这是因为你的75在文本里面是整形存储,你用了f9.3的浮点型来读取,这种读取方式是很危险的,你在75后面加小数点就好了
6 楼
GuiltyOne [专家分:60] 发布于 2012-09-10 21:38:00
再请教各位高手一个简单的问题,代码如下:
integer i,m,j
dimension m(10)
integer :: n(10)=(/1,2,1,2,1,2,1,2,1,2/)
do i=1,10
n(i)=m(i)
write(*,*)m(i)
enddo
我用这个方式初衷是让n(i)=m(i),但是在循环中这样做了之后不论n(i)还是m(i)的输出都是零,请教一下这是为什么,还有该怎么办,谢谢各位
7 楼
GuiltyOne [专家分:60] 发布于 2012-09-10 21:38:00
代码粘的不好,再试一次
integer i,m,j
dimension m(10)
integer :: n(10)=(/1,2,1,2,1,2,1,2,1,2/)
do i=1,10
n(i)=m(i)
write(*,*)m(i)
enddo
8 楼
GuiltyOne [专家分:60] 发布于 2012-09-10 21:41:00
还有leilfm大哥,你说的确实对,我后来特意回去试了下浮点读取整型变量的写法,确实向您所说的那样,现在我有经验了哈
9 楼
臭石头雪球 [专家分:23030] 发布于 2012-09-10 23:10:00
n 有值。但是 m 没有值。
你让有值的 n = 没有值的m,自然就被洗掉了。
应该是 m = n 才对。
另外,Fortran 的矩阵运算十分方便。你的代码完全可以简化为:
[quote]integer i,m,j
dimension m(10)
integer :: n(10)=(/1,2,1,2,1,2,1,2,1,2/)
m = n
!// 或 m(:) = n(:)
write(*,*)m
[/quote]
最后,leilfm 说得欠妥。
文本文件中的 75,并不代表其是整型。
不管是文本文件,还是二进制文件。
任何文件都不规定其中的数据是什么类型的。
你试着把
read(11,"(4x,a5,9x,f8.5,3x,f9.5,3x,f9.3)")nam,weid,jingd,gaod
改成
read(11,"(4x,a5,9x,f8.5,3x,f9.5,3x,f9.0)")nam,weid,jingd,gaod
你会发现,75读对了,而后面的读错了。
为什么呢?因为这样的错误不是因为文件中是整数。
而是你的格式符与文件中的格式不一致。
这正是我提倡使用 * 自由读取的原因
10 楼
GuiltyOne [专家分:60] 发布于 2012-09-11 11:04:00
嗷嗷,真的是太受教了,我学fortran的时间不长,都是在用的过程中慢慢学的,所以受到别人程序模版的影响很深,经过石头哥这么一点醒真的是大开眼界啊,以后我要多上论坛跟大家交流交流[em4][em4][em4]
我来回复