爱气象,爱气象家园! 

气象家园

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博登陆

只需一步, 快速开始

搜索
查看: 5433|回复: 8

fortran遇到文件读入终止

[复制链接]

新浪微博达人勋

发表于 2014-4-27 13:38:17 | 显示全部楼层 |阅读模式
Fortran
系统平台: fortran
问题概况: 程序如下,读的时候出现报错,end of file during read.
问题截图: -
我看过提问的智慧: 看过
自己思考时长(天): 4

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

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

x
program getdata
implicit none
character*40 filename
character*100 fpath,output
integer :: status,k=0,su,error,i,t,vv
integer,allocatable::v1(:),v2(:),v3(:),v4(:)     
                                   
                          
fpath='f:\gxm\dabaoyu\*.TXT'                                    
output='f:\gxm\dir.txt'                              
call ListToFile(fpath,output)                          
open(3,file='f:\gxm\dir.txt')                          
do
read(3,*,iostat=status) filename
print*,filename
open(2,file='f:\gxm\su\'//filename,status='replace')

if(status/=0) exit                           
open(1,file='f:\gxm\dabaoyu\'//filename,status='old')
i=1
do
read(1,*,iostat=error)
if(error/=0) exit
i=i+1
end do
t=i
print*,t
allocate(v1(t-1))
allocate(v2(t-1))
allocate(v3(t-1))
allocate(v4(t-1))
print*,filename
print*,v1(t-1)
do i=1,t-1
read(1,*) v1(i),v2(i),v3(i),v4(i)
print*,v1(i)
enddo
i=1
vv=v2(1)
su=0
do while(t<=i)
if(v2(i)==vv) then
su=su+v4(i)  
else
print*,v1(i-1),v2(i-1),su
vv=v2(i)
su=0
end if
i=i+1
end do
close(1)
close(2)
end do
close(3)
end

!输入并保存数据文件名的子程序
subroutine ListToFile(Fpath,Output)
   character*100::Fpath,Output
   character*100 CMD
   logical(4) res
   CMD="dir /b "//trim(fpath)//">"//trim(output)
   res=SYSTEMQQ(CMD)
endsubroutine


其中子程序是自动生成dir.txt的,dir.txt里面是若干个文件名,用于批量读取filename文件(之前试过,是可以用的)。红色那一行在读入的时候报错(因为之后那一行print*,v1(i)没有执行,也就是说第一行都没有读入)文件的情况大致截取一个片段如下:

    56187    2004       4     454
    56187    2004       5     744
    56187    2004       5     282
    56187    2004       5     441
    56187    2004       6     283
    56187    2004       7     278
    56187    2004       8     891
    56187    2004       8     293
    56187    2004       8     328
    56187    2004      10     365
    56187    2005       6     565
    56187    2005       6     608
    56187    2005       7     433
    56187    2005       7     530
    56187    2005       8     495
    56187    2005       8     281
    56187    2005       8     349
    56187    2006       5     263
    56187    2006       6     286
    56187    2006       7     568
    56187    2006       7     761
    56187    2006       7     770
    56187    2006      10     272
    56187    2007       5     419
    56187    2007       5     255
    56187    2007       6     266
    56187    2007       7     306
    56187    2007       8     389
    56187    2008       6     422
    56187    2008       7     373
    56187    2008       7     566
程序的目的是给第四列数据按照年份求和,不知道哪位大神愿意帮帮我呢。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-4-27 14:03:52 | 显示全部楼层
一开始的问题解决了,是因为少了一个rewind(1),导致文件没有再能从头读起,但是新问题是:allocatable设定的不设上限的数组,当用allocate()设定了一次上限后,就不能再用了allocate()了,请问大神们怎么破?
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-4-27 14:05:58 | 显示全部楼层
do
read(1,*,iostat=error)
if(error/=0) exit
i=i+1
end do
的时候,已经读到文件的结尾了。在红色字循环之前先close(1),然后在重新open一次试试
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-4-27 14:11:06 | 显示全部楼层
解决了  deallocate()语句  书上刚看到。。。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-4-27 14:17:44 | 显示全部楼层
朽木露琪亚 发表于 2014-4-27 14:05
do
read(1,*,iostat=error)
if(error/=0) exit

恩恩  这样也行  非常感谢!
密码修改失败请联系微信:mofangbao

新浪微博达人勋

发表于 2014-4-27 14:27:15 | 显示全部楼层
q863510557 发表于 2014-4-27 14:17
恩恩  这样也行  非常感谢!

简单点就直接把读取位置返回开始位置,我忘记是哪个命令了
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-4-27 14:49:25 | 显示全部楼层
朽木露琪亚 发表于 2014-4-27 14:27
简单点就直接把读取位置返回开始位置,我忘记是哪个命令了

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

新浪微博达人勋

发表于 2014-4-27 14:58:01 | 显示全部楼层

我Fortran半吊子,平时不用它的,用的是其他语言。
密码修改失败请联系微信:mofangbao

新浪微博达人勋

 楼主| 发表于 2014-4-27 14:59:36 | 显示全部楼层
朽木露琪亚 发表于 2014-4-27 14:58
我Fortran半吊子,平时不用它的,用的是其他语言。

fortran都这么牛逼了  其他还得了???
密码修改失败请联系微信:mofangbao
您需要登录后才可以回帖 登录 | 立即注册 新浪微博登陆

本版积分规则

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

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

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