在 Fortran 中,阅读的实用方法是什么:
A 1. 2. 3.
如果第一个字符是“A”,但不读取:
Z
例如,如果第一个字符是“Z”,则休息。
如果我尝试完整阅读该行:
read(1,*)char, number1, number2, number3
如果缺少数字,则会发生错误。所以我需要一种方法来读取该行上的“A”停留,如果需要其余部分,则取决于读取的“A”或“Z”。
您始终可以读取标志并使用 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
这是一个你可能不知道的好技巧。您可以在读取语句中单元号的位置放置一个字符变量。您将从变量而不是文件中读取。
首先声明一个足够长的字符变量以读取最长的行。将整行读入此变量。从变量中,读取第一个字符。如果是 A,请读入数字。它看起来像这样:
character*130 :: MyLine
read(1,'(a130)') MyLine
read(MyLine,*) char
if (char == 'A') then
read(MyLine,*) char, number1, number2, number3
endif
与您想要的稍有偏差的是用要读取的数字数替换第一个字母,例如
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 值转换为要读取的实数。