爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 7720|回复: 14

[求助] 为什么fortran输出结果都是0呢

[复制链接]

新浪微博达人勋

发表于 2017-9-8 10:31:09 | 显示全部楼层 |阅读模式

登录后查看更多精彩内容~

您需要 登录 才可以下载或查看,没有帐号?立即注册 新浪微博登陆

x
本帖最后由 love2100 于 2017-9-14 17:00 编辑

各位大侠,本人目前处理一些站点小时降水数据,现在把数据读入之后,又读取出来,怎么就都是星号了呢?求各位大侠指教。
编写的程序如下:
module typedef
  type::rainfall
    integer :: station,year,month,day,time
    real    :: prep
  end type rainfall
end module
program main
  use typedef
  implicit none
   
  integer,parameter::fileid_in=10
  integer,parameter::fileid_out=20
  integer::i,j,error
  integer::status=0
  type(rainfall)::infor(23012)
   open(UNIT=fileid_out,file="E57067_2.txt")
   open(UNIT=fileid_in,file="E57067_11.txt",STATUS='OLD',iostat=error)
    if(error/=0) then
   write(*,*) "open file failed"
   stop
end if
  
  do i=1,23012
    read(fileid_in,IOSTAT=status,FMT=) infor(i)%station,infor(i)%year,infor(i)%month,infor(i)%day,infor(i)%time,infor(i)%prep
   if(status/=0) exit
  end do
  do j=1,23012
    write(fileid_out,*)  infor(j)%station,infor(j)%year,infor(j)%month,infor(j)%day,infor(j)%time,infor(j)%prep
  end do
  stop
end

输入文本格式如下:站点号、年、月、日、时、降水量                     
57067 2014 5 18 10 0
57067 2014 5 18 11 0
57067 2014 5 18 12 0
57067 2014 5 18 13 0
57067 2014 5 18 14 0
57067 2014 5 18 15 0
57067 2014 5 18 16 0
57067 2014 5 18 17 0
57067 2014 5 18 18 0
57067 2014 5 18 19 0
57067 2014 5 18 20 0
57067 2014 5 18 21 0
57067 2014 5 18 22 0
57067 2014 5 18 23 0
57067 2014 5 19 0 0
57067 2014 5 19 1 0
57067 2014 5 19 2 0
57067 2014 5 19 3 0
57067 2014 5 19 4 0
57067 2014 5 19 5 0
57067 2014 5 19 6 0
57067 2014 5 19 7 0
57067 2014 5 19 8 0
57067 2014 5 19 9 0
57067 2014 5 19 10 0
57067 2014 5 19 11 0
57067 2014 5 19 12 0

输出的文本格式如下:
0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00
           0           0           0           0           0  0.0000000E+00






7YEAAL{ZKF5SEVKFAV8$TXJ.png
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-9-8 10:35:20 | 显示全部楼层
格式输出有错误,把格式改改
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-9-8 10:43:06 | 显示全部楼层
问题好像不在这里,我把输出格式修改了,如下,输出格式是变化了,但是结果仍然是0啊?
do j=1,23012
    write(fileid_out,"( I7, I4, I2,I2,I2,F7.1)")  infor(j)%station,infor(j)%year,infor(j)%month,infor(j)%day,infor(j)%time,infor(j)%prep
  end do
0   0 0 0 0    0.0
      0   0 0 0 0    0.0
      0   0 0 0 0    0.0
      0   0 0 0 0    0.0
      0   0 0 0 0    0.0
      0   0 0 0 0    0.0
      0   0 0 0 0    0.0
      0   0 0 0 0    0.0
      0   0 0 0 0    0.0
      0   0 0 0 0    0.0
      0   0 0 0 0    0.0
      0   0 0 0 0    0.0

密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-9-8 10:53:40 | 显示全部楼层
love2100 发表于 2017-9-8 10:43
问题好像不在这里,我把输出格式修改了,如下,输出格式是变化了,但是结果仍然是0啊?
do j=1,23012
    ...

检查下数据read进来了么
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-9-8 21:04:05 | 显示全部楼层
lqouc 发表于 2017-9-8 10:53
检查下数据read进来了么

谢谢提醒,反复试验后终于发现问题竟然出现在这里:
do i=1,num_line
    read(fileid_in,*) infor(i)%station,infor(i)%year,infor(i)%month,infor(i)%day,infor(i)%time,infor(i)%prep
  end do
我把read中的参数IOSTAT删除后就正常了,结果达到了预期目的。但是个人感觉仍然很疑惑,这是为什么呢???
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-9-8 21:17:57 | 显示全部楼层
love2100 发表于 2017-9-8 21:04
谢谢提醒,反复试验后终于发现问题竟然出现在这里:
do i=1,num_line
    read(fileid_in,*) infor(i)% ...

把你module中定义type数据类型里面的“integer :: station,year,month,day,time”这句话乖乖地拆成5句,就不会报错了。至于什么原因,请认真了解派生类型type的定义说明以及使用。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-9-8 21:52:31 | 显示全部楼层
风之精灵 发表于 2017-9-8 21:17
把你module中定义type数据类型里面的“integer :: station,year,month,day,time”这句话乖乖地拆成5句, ...

谢谢风之精灵啦。我看的是彭国伦那本书,里面声明自定义数据类型时,类型相同的一次性声明出来,并没有拆开分别声明,不知道你说的关于type的定义和使用是在哪本书里面有详细说明呢?谢谢。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-9-8 21:55:39 | 显示全部楼层
love2100 发表于 2017-9-8 21:52
谢谢风之精灵啦。我看的是彭国伦那本书,里面声明自定义数据类型时,类型相同的一次性声明出来,并没有拆 ...

忘记说了,按照你的办法的确有效:输出结果不再是0
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2017-9-9 20:28:47 | 显示全部楼层
love2100 发表于 2017-9-8 21:55
忘记说了,按照你的办法的确有效:输出结果不再是0

抱歉,我也不记得了(已经好久没有写Fortan代码)。你那个问题应该是在type里面整型变量具有不同的列宽,放在一起声明,然后一起使用引起了读写时候的格式识别错误。彭老师的那本书里面一起声明时,同一变量具有相同的列宽或者格式吧
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2017-9-9 22:10:44 | 显示全部楼层
又长见识了,谢谢“风之精灵”
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

Copyright ©2011-2014 bbs.06climate.com All Rights Reserved.  Powered by Discuz! (京ICP-10201084)

本站信息均由会员发表,不代表气象家园立场,禁止在本站发表与国家法律相抵触言论

快速回复 返回顶部 返回列表