回 帖 发 新 帖 刷新版面

主题:fortran判断空文件的方法


有规律的一系列文件(如1.txt,2.txt,。。。)
其中有些文件是空文本,有些是有内容的文本,想用fortran程序实现顺序读取,如果是空文本就跳过,不读取,然后继续读写下一个文件。但现在总是读到空文件就出错,自动跳出。不知道如何解决,望高手指点!!!

回复列表 (共7个回复)

沙发

Iostate 之类的关键字不妨看看。

板凳


试过,行不通。

3 楼

贴出你的代码

4 楼

         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 楼

这是要读取的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 楼

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 楼


在你的每个文本开始时加EOF语句判断
如 OPEN(1,FILE='')
IF(EOF(1))THEN
    CLOSE(1)
          ELSE
    .....读取数据!

我来回复

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