0

我使用 F95/90 和 IBM 编译器。我正在尝试从块中提取数值并写入文件。我在输出中遇到了一个我无法理解的奇怪错误。每次我执行程序时,它都会跳过“Beta”和“END”之间的循环。我正在尝试读取和存储这些值。Alpha 和 Beta 循环内的行数不固定。所以一个简单的“做循环”对我没有用。我尝试了“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
4

1 回答 1

1

您的程序永远不会退出检查 Beta 的循环,因为当您的 while 循环退出时,它已经读取了带有 Beta 的行。然后它转到 100 读取 Beta 之后的下一行,因此您实际上永远不会看到 Beta Singles。尝试以下

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'
于 2013-05-13T20:09:24.720 回答