主题:fortran判断空文件的方法
喜欢夏天
[专家分:0] 发布于 2010-03-26 10:33:00
有规律的一系列文件(如1.txt,2.txt,。。。)
其中有些文件是空文本,有些是有内容的文本,想用fortran程序实现顺序读取,如果是空文本就跳过,不读取,然后继续读写下一个文件。但现在总是读到空文件就出错,自动跳出。不知道如何解决,望高手指点!!!
回复列表 (共7个回复)
沙发
asymptotic [专家分:16630] 发布于 2010-03-26 11:30:00
Iostate 之类的关键字不妨看看。
板凳
喜欢夏天 [专家分:0] 发布于 2010-03-29 15:10:00
试过,行不通。
3 楼
臭石头雪球 [专家分:23030] 发布于 2010-03-29 16:19:00
贴出你的代码
4 楼
喜欢夏天 [专家分:0] 发布于 2010-03-29 17:15:00
integer,dimension(1) :: std,nn
real,allocatable :: press(:)
real,allocatable :: hgt(:),temp(:),td(:),wdir(:),wspd(:)
integer n,iochk,m_dy,y,p
character*100 f1,f2
f1='19800101.txt'
f2='19800101-55591.txt'
do 60 y=1980,1999
write(f1(1:4),'(i4.4)') y
write(f2(1:4),'(i4.4)') y
do 50 p=1,12 !对每个月天数做判断
select case(p)
case(1)
m_dy=31
case(2)
m_dy=28
if(mod(y,4)==0.and.mod(y,100)/=0) m_dy=29
if(mod(y,100)==0.and.mod(y,400)==0) m_dy=29
case(3)
m_dy=31
case(4)
m_dy=30
case(5)
m_dy=31
case(6)
m_dy=30
case(7)
m_dy=31
case(8)
m_dy=31
case(9)
m_dy=30
case(10)
m_dy=31
case(11)
m_dy=30
case(12)
m_dy=31
end select
write(f1(5:6),'(i2.2)') p
write(f2(5:6),'(i2.2)') p
do 40 k=1,m_dy
write(f1(7:8),'(i2.2)') k
write(f2(7:8),'(i2.2)') k
open (11, file =f1,status ='old',iostat = iochk)
open (12, file = f2,status = 'unknown')
if(iochk/=0)then
write(12,*)
elseif(iochk==0)then
99 read(11,*) std(1),nn(1) !读取台站号和此站点包含的资料行数
n=nn(1)
if(std(1).ne.55591.and.std(1).lt.55591)then
go to 99
elseif(std(1).eq.55591)then
allocate(press(n))
allocate(hgt(n))
allocate(temp(n))
allocate(td(n))
allocate(wdir(n))
allocate(wspd(n))
read(11,*) press(1),hgt(1),temp(1),td(1),wdir(1),wspd(1)
write(12,55) press(1),hgt(1),temp(1),td(1),wdir(1),wspd(1)
do 10 j=2,n
read(11,*) press(j),hgt(j),temp(j),td(j),wdir(j),wspd(j)
if(press(j).eq.500)then
write(12,55) press(j),hgt(j),temp(j),td(j),wdir(j),wspd(j)
elseif(press(j).eq.400)then
write(12,55) press(j),hgt(j),temp(j),td(j),wdir(j),wsp(j)
endif
55 format(6f10.2)
10 continue
deallocate(press)
deallocate(hgt)
deallocate(temp)
deallocate(td)
deallocate(wdir)
deallocate(wspd)
elseif(std(1).gt.55591)then
write(12,*)
endif
endif
40 continue
50 continue
60 continue
end
5 楼
喜欢夏天 [专家分:0] 发布于 2010-03-29 17:20:00
这是要读取的19800101.txt文件
55299 3
588 99999 -3 170 270 6
500 5780 -113 110 245 12
400 7440 -255 50 250 17
55591 3
654 99999 82 190 270 3
500 5800 -99 150 235 8
400 7480 -241 160 270 21
56137 3
683 99999 72 180 180 2
500 5790 -135 90 255 5
400 7440 -263 90 275 14
现在我遇到的情况是19800101.txt这个文件为空文件,则总是报错。
6 楼
臭石头雪球 [专家分:23030] 发布于 2010-03-29 17:47:00
iostat 写在第一个 Read 语句里,如果出错,则跳出当前循环,进入下一个文件。
不要写在 Open 里,因为空白文件 Open 不会出错。
另外,你的 select 语句似乎有点笨。
用下面的方法代替:
Integer , Parameter :: DAYS_OF_MONTH( 12 ) = (/31,28,31,30,31,30,31,31,30,31,30,31/)
m_dy = DAYS_OF_MONTH( p )
if(mod(y,4)==0.and.mod(y,100)/=0) m_dy=29
if(mod(y,100)==0.and.mod(y,400)==0) m_dy=29
7 楼
haizh [专家分:30] 发布于 2010-03-29 20:19:00
在你的每个文本开始时加EOF语句判断
如 OPEN(1,FILE='')
IF(EOF(1))THEN
CLOSE(1)
ELSE
.....读取数据!
我来回复