回 帖 发 新 帖 刷新版面

主题:请教一个很古怪的读写问题

数据如下:

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

沙发

通常,我不推荐用格式化 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

板凳


谢谢石头兄,有你的帮助实在是太好了![em12]

3 楼


补充问一下石头兄,格式化read有什么不妥之处么?

4 楼

1.麻烦
2.通用性不强。多一个,少一个空格就读不了。

5 楼

这是因为你的75在文本里面是整形存储,你用了f9.3的浮点型来读取,这种读取方式是很危险的,你在75后面加小数点就好了

6 楼

再请教各位高手一个简单的问题,代码如下:
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 楼

代码粘的不好,再试一次

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 楼


还有leilfm大哥,你说的确实对,我后来特意回去试了下浮点读取整型变量的写法,确实向您所说的那样,现在我有经验了哈

9 楼

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 楼


嗷嗷,真的是太受教了,我学fortran的时间不长,都是在用的过程中慢慢学的,所以受到别人程序模版的影响很深,经过石头哥这么一点醒真的是大开眼界啊,以后我要多上论坛跟大家交流交流[em4][em4][em4]

我来回复

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