读取内容取决于第一个字符的行

时间:2010-04-27 04:22:50

标签: string io fortran fortran90

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

 A 1. 2. 3.   

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

 Z
如果第一个字符是“Z”,则

休息。

如果我试着读完整行:

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

如果缺少数字,则会发生错误。因此,我需要一种方法来读取该行上的“A”停留,并根据“A”或“Z”读取,如果需要,其余部分。

3 个答案:

答案 0 :(得分:1)

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

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

character*130 :: MyLine

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

答案 1 :(得分: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 :(得分:0)

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

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值转换为要读取的实数。