Fortran Coder

查看: 8084|回复: 4
打印 上一主题 下一主题

[文件读写] Ftn95讀取时的无限循环(backspace)

[复制链接]

35

帖子

12

主题

0

精华

熟手

F 币
173 元
贡献
117 点
跳转到指定楼层
楼主
发表于 2014-11-14 18:10:45 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
不知道哪裡出了問題,這個程式在22讀完之後一直處於無限迴圈,哪位高手可以告訴我如何修正呢?!
感激不盡

[Fortran] 纯文本查看 复制代码
program interp2_line_pwv
implicit none

integer :: stat,stat2,stat3,yr_1,dayofyear_1,hr_1
integer :: yr_2,dayofyear_2,hr_2,yr,Days_Of_Year,m,n,dayofyear,hr
character :: filename*13,filename_new*14
real*8 :: timeall,time_all_1,pwv_mm_1,time_all_2,pwv_mm_2,fake

open (11,file='file.txt')
close (11,status='delete')
call system('for %f in (*_wave.pwv) do echo %f >> file.txt' )
open (11,file='file.txt')

stat=0
do while (stat==0)
  read (11,*,iostat=stat) filename  
  if (stat/=0) exit
  filename_new = filename(1:9)//'2.pwv'
  open (22,file=filename)
  open (33,file=filename_new)
  
  stat2=0
  do while (stat2==0)
    read (22,*,iostat=stat2) time_all_1,pwv_mm_1,yr_1,dayofyear_1,hr_1
    read (22,*,iostat=stat2) time_all_2,pwv_mm_2,yr_2,dayofyear_2,hr_2
    if (stat2 /= 0 ) exit
    backspace (22)
    if (yr_1 == yr_2) then
      write (33,100) time_all_1,pwv_mm_1,yr_1,dayofyear_1,hr_1 
100   format(f12.7,3x,f12.7,3x,i4.4,3x,i3.3,3x,i2.2)          
    else !( yr_1 /= yr_2 )       
      write (33,150) time_all_1,pwv_mm_1,yr_1,dayofyear_1,hr_1
150   format (f12.7,3x,f12.7,3x,i4.4,3x,i3.3,3x,i2.2)
      fake=1D0
!------------------------------------> part 1
      yr=yr_1
      call determine1 (yr,Days_Of_Year)
      m=0
      n=0
      do while (.true.)
        m=m+1
        if (m==1) then
          dayofyear=dayofyear_1
          dayofyear=dayofyear+1
        else ! m>1
          dayofyear=dayofyear+1
        end if 
        if (dayofyear > Days_Of_Year ) exit                
        hr=-2
        do while (.true.)
          n=n+1
          if (n==1) then
            hr=hr_1
            hr=hr+2
          else ! n>1
            hr=hr+2
          end if
          if (hr==24) exit
          call convertday (yr,hr,dayofyear,timeall)
          write(33,200) timeall,fake,yr,dayofyear,hr
200       format(f12.7,3x,f12.7,3x,i4.4,3x,i3.3,3x,i2.2)
        end do  
      end do
!------------------------------------> part 1    
!------------------------------------> part 2     
      if (yr_2-yr_1 > 1) then
        yr=yr_1
        do while (.true.)
          yr=yr+1
          if (yr==yr_2) exit
          call determine1 (yr,Days_Of_Year)
          dayofyear=0
          do while (.true.)
            dayofyear=dayofyear+1 
            if (dayofyear > Days_Of_Year) exit
            hr=-2
            do while (.true.)
              hr=hr+2
              if (hr==24) exit
              call convertday (yr,hr,dayofyear,timeall)
              write (33,250) timeall,fake,yr,dayofyear,hr
250           format (f12.7,3x,f12.7,3x,i4.4,3x,i3.3,3x,i2.2)              
            end do         
          end do
        end do
      end if
!------------------------------------> part 2
!------------------------------------> part 3
      yr=yr_2 
      dayofyear=0  
      do while (.true.)
        dayofyear=dayofyear+1
        if (dayofyear > dayofyear_2) exit
        hr=-2  
        do while (.true.)
          hr=hr+2
          if (hr==24) exit
          if (dayofyear == dayofyear_2 .and. hr == hr_2) exit
          call convertday (yr,hr,dayofyear,timeall)
          write (33,300) timeall,fake,yr,dayofyear,hr
300       format (f12.7,3x,f12.7,3x,i4.4,3x,i3.3,3x,i2.2)
        end do 
      end do
!------------------------------------> part 3    
      write (33,350) time_all_2,pwv_mm_2,yr_2,dayofyear_2,hr_2
350   format (f12.7,3x,f12.7,3x,i4.4,3x,i3.3,3x,i2.2)    
    end if
  end do
end do
end program

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
subroutine determine1 (yr,Days_Of_Year)

integer :: yr,Days_Of_Year

  if (MOD(yr,4)==0 .and. MOD(yr,100)/=0) then
     Days_Of_Year = 366
  else if(MOD(yr,4)==0 .and. MOD(yr,100)==0 .and. MOD(yr,400)==0) then
     Days_Of_Year = 366
  else !(MOD(yr,4)==0 .and. MOD(yr,100)==0 .and. MOD(yr,400)/=0) then
     Days_Of_Year = 365     
  end if
  
end subroutine
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
subroutine convertday (yr,hr,dayofyear,timeall)
  
  integer :: yr,hr,dayofyear
  real*8 :: timeall
  integer :: Days_Of_Year
  
!  DAY_OF_MONTH = (/31,28,31,30,31,30,31,31,30,31,30,31/)   
  if (MOD(yr,4)==0 .and. MOD(yr,100)/=0) then
!     DAY_OF_MONTH(2) = 29
     Days_Of_Year = 366
  else if(MOD(yr,4)==0 .and. MOD(yr,100)==0 .and. MOD(yr,400)==0) then
!     DAY_OF_MONTH(2) = 29
     Days_Of_Year = 366
  else !(MOD(yr,4)==0 .and. MOD(yr,100)==0 .and. MOD(yr,400)/=0) then
     Days_Of_Year = 365     
  end if
    
!  if ( mon > 1 ) then
!    dayofyear = day + sum( DAY_OF_MONTH(1:mon-1) )
!  else
!    dayofyear = day
!  end if
    timeall = yr*1.0D0+(dayofyear-0.99D0)/Days_Of_Year + 1.0D0*hr/(Days_Of_Year*24.0D0)
 end subroutine   
 



BANC_wave.rar

147 Bytes, 下载次数: 7

分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

沙发
发表于 2014-11-15 08:45:48 | 只看该作者
我无法重现你的错误,在我这里正常运行并结束了,并没有陷入死循环。

BANC_wave2.pwv 的内容是:
1997.6655525     56.1592272   1997   243   22

我在end program 前面加了一句
[Fortran] 纯文本查看 复制代码
write(*,*) 'end program'
end program


运行后在窗口看到:

F:\Developer\MyProject\t\Console2\Console2>echo BANC_wave.pwv  1>>file.txt
end program
请按任意键继续. . .

35

帖子

12

主题

0

精华

熟手

F 币
173 元
贡献
117 点
板凳
 楼主| 发表于 2014-11-17 11:57:33 | 只看该作者
楚香饭 发表于 2014-11-15 08:45
我无法重现你的错误,在我这里正常运行并结束了,并没有陷入死循环。

BANC_wave2.pwv 的内容是:

我出現這種狀況的編譯器:Silverfrost FTN95
這問題也如楚香饭大大所言,如果使用Visual Studio 2013的fortran編譯器,則不會有死迴圈的問題˙。

712

帖子

4

主题

0

精华

大师

农村外出务工人员

F 币
607 元
贡献
311 点

新人勋章爱心勋章水王勋章元老勋章热心勋章

地板
发表于 2014-11-18 10:40:14 | 只看该作者
Ftn95 读取文件的 backspace 有问题。
If the preceding record is an endfile record, the file is positioned before the endfile record.
所以,为了避免到文件尾端,造成 backspace 无效,你可以在 BANC_wave.pwv 尾部加一个空白回车。

我记得 CVF 也有相同的问题。

35

帖子

12

主题

0

精华

熟手

F 币
173 元
贡献
117 点
5#
 楼主| 发表于 2014-11-18 17:44:59 | 只看该作者
楚香饭 发表于 2014-11-18 10:40
Ftn95 读取文件的 backspace 有问题。
所以,为了避免到文件尾端,造成 backspace 无效,你可以在 BANC_wav ...

感謝您的回覆,讓小弟我學到不少。
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-4-30 14:47

Powered by Tencent X3.4

© 2013-2024 Tencent

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