数据提取的建议在fortran中的数据

时间:2013-05-12 19:52:44

标签: algorithm loops fortran

我使用F95 / 90和IBM编译器。我试图从块中提取数值并写入文件。我在输出中遇到一个奇怪的错误,我无法理解。每次执行程序时,它都会跳过“Beta”和“END”之间的循环。我正在尝试阅读和存储值。 Alpha和Beta循环内的行数不固定。所以一个简单的'do loop'对我来说毫无用处。我尝试了'do while'循环以及'if-else',但它仍然跳过'Beta'部分。

Alpha Singles Amplitudes
15      3    23      4   -0.186952
15      3    26      4    0.599918
15      3    31      4    0.105048
15      3    23      4    0.186952
Beta  Singles Amplitudes
15      3    23      4    0.186952
15      3    26      4   -0.599918
15      3    31      4   -0.105048
15      3    23      4   -0.186952
END `

简单的短代码是:

program test_read

   implicit none

      integer::nop,a,b,c,d,e,i,j,k,l,m,ios
      double precision::r,t,rr
      character::dummy*300
      character*15::du1,du2,du3
      open (unit=10, file="1.txt", status='old',form='formatted')

  100   read(10,'(a100)')dummy

        if (dummy(1:3)=='END') goto 200

        if(dummy(2:14)=='Alpha Singles') then
             i=0
  160       read(10,'(a4,i2,a6,i1,a4,i2,a6,i1,f12.6)')du1,b,du2,c,du3,d,du4,e,r              
            do while(du1.ne.' Bet') 
    write(*,'(a2,a4,i2,a6,i1,a4,i2,a6,i1,f12.6)')'AS',du1,b,du2,c,du3,d,du4,e,r
    goto 160
    end do                     

        elseif (dummy(2:14)=='Beta  Singles') then
  170       read(10,'(a4,i2,a6,i1,a4,i2,a6,i1,f12.6)')du1,b,du2,c,du3,d,du4,e,r
            if((du1=='END'))then
              stop
        else      

     write(*,'(a2,a4,i2,a6,i1,a4,i2,a6,i1,f12.6)')'BS',du1,b,du2,c,du3,d,du4,e,r             
            goto 170      
    end if
    end if
        goto 100      

   200    print*,'This is the end' 

  end program test_read

1 个答案:

答案 0 :(得分:1)

你的程序永远不会离开检查Beta的循环,因为当你的while循环退出时,它已经读取了Beta的行。然后转到100,读取Beta之后的下一行,所以你永远不会看到Beta单曲。请尝试以下

character(len=2):: tag
read(10,'(a100)')dummy

do while (dummy(1:3).ne.'END')
    if (dummy(2:14)=='Alpha Singles') then
       tag = 'AS'
    else if (dummy(2:14)=='Beta  Singles') then
       tag = 'BS'
    else
       read(dummy,'(a4,i2,a6,i1,a4,i2,a6,i1,f12.6)')du1,b,du2,c,du3,d,du4,e,r              
       write(*,'(a2,a4,i2,a6,i1,a4,i2,a6,i1,f12.6)')tag,du1,b,du2,c,du3,d,du4,e,r
    end if
    read(10, '(a100)') dummy
 end do

 print*,'This is the end'