0

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

 A 1. 2. 3.   

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

 Z

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

如果我尝试完整阅读该行:

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

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

4

3 回答 3

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
于 2018-01-28T08:47:37.823 回答
1

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

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

character*130 :: MyLine

read(1,'(a130)') MyLine
read(MyLine,*) char
if (char == 'A') then
   read(MyLine,*) char, number1, number2, number3
endif
于 2018-01-28T02:06:51.610 回答
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 值转换为要读取的实数。

于 2011-01-25T03:52:38.867 回答