【问题标题】:Reading a line whose contents depends on the first character读取内容取决于第一个字符的行
【发布时间】:2011-02-12 16:57:34
【问题描述】:

在 Fortran 中,什么是实用的阅读方式:

 A 1. 2. 3.   

如果第一个字符是“A”,但不读取:

 Z

例如,如果第一个字符是“Z”,则休息。

如果我尝试阅读整行:

read(1,*)char, number1, number2, number3

如果缺少数字,则会发生错误。所以我需要一种方法来读取该行上的“A”,如果需要其余部分,则取决于读取的“A”或“Z”。

【问题讨论】:

    标签: string io fortran fortran90


    【解决方案1】:

    您始终可以读取标志并使用 iolist 中的表达式来确定是否要读取更多内容。
    az.f90:

    program az
       implicit none
       real number1, number2, number3
       character azflag
       integer iunit
       integer i
       open(newunit=iunit,file='az.txt',status='old')
       do
          number1 = -1
          number2 = -1
          number3 = -1
          read(iunit,*,end=10) azflag, (number1,number2,number3 &
             ,i=1,merge(1,0,any(azflag==['A','a'])))
          if(any(azflag==['A','a'])) then
             write(*,*) 'numbers read!'
          else
             write(*,*) 'nothing read'
          end if
          write(*,*) number1, number2, number3
       end do
    10 continue
    end program az
    

    az.txt:

     A 1. 2. 3.
     Z
     a 4. 5. 6.
     z
    

    输出:

     numbers read!
       1.000000       2.000000       3.000000
     nothing read
      -1.000000      -1.000000      -1.000000
     numbers read!
       4.000000       5.000000       6.000000
     nothing read
      -1.000000      -1.000000      -1.000000
    

    【讨论】:

      【解决方案2】:

      这是一个你可能不知道的好技巧。您可以在读取语句中单元号的位置放置一个字符变量。您将从变量而不是文件中读取。

      首先声明一个字符变量,其长度足以读取最长的行。将整行读入此变量。从变量中,读取第一个字符。如果是 A,请读入数字。它看起来像这样:

      character*130 :: MyLine
      
      read(1,'(a130)') MyLine
      read(MyLine,*) char
      if (char == 'A') then
         read(MyLine,*) char, number1, number2, number3
      endif
      

      【讨论】:

        【解决方案3】:

        与您想要的略有不同的是,将第一个字母替换为要读取的数字数,例如

        3 1. 2. 3.
        0
        2 3.14 -1.
        

        那么如果你想在每行中读取的最大元素数是nmax 然后声明

        integer::i,n
        real(dimension=nmax)::number
        

        并使用

        read(1,*) n, (number(i), i=1,n)
        

        如果你真的想继续使用字母,你可以使用iachar() 破解一些东西,将字符的 ASCII 值转换为要读取的实数。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-04-07
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多