在Fortran中,阅读的实用方法是什么:
A 1. 2. 3.
如果第一个字符是“A”,但不读取:
Z
如果第一个字符是“Z”,则休息。
如果我试着读完整行:
read(1,*)char, number1, number2, number3
如果缺少数字,则会发生错误。因此,我需要一种方法来读取该行上的“A”停留,并根据“A”或“Z”读取,如果需要,其余部分。
答案 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值转换为要读取的实数。