在Fortran中,這將是切實可行的方法爲:讀一本線,其內容取決於第一個字符
A 1. 2. 3.
如果第一個字符是一個「A」,但沒有看過:
Z
如果第一個字符是「Z」,例如休息。
如果我試圖在整個讀取行:
read(1,*)char, number1, number2, number3
那麼如果數字是缺少會出現錯誤。因此,我需要一種方法來讀取該行上的「A」,並根據「A」或「Z」讀取,如果需要,請閱讀其餘部分。
在Fortran中,這將是切實可行的方法爲:讀一本線,其內容取決於第一個字符
A 1. 2. 3.
如果第一個字符是一個「A」,但沒有看過:
Z
如果第一個字符是「Z」,例如休息。
如果我試圖在整個讀取行:
read(1,*)char, number1, number2, number3
那麼如果數字是缺少會出現錯誤。因此,我需要一種方法來讀取該行上的「A」,並根據「A」或「Z」讀取,如果需要,請閱讀其餘部分。
從你想將取代由數字閱讀人數的第一個字母是什麼稍有偏差,像
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值。
這是一個很好的技巧,你可能不知道。您可以在單元編號位於read語句中的位置放置一個字符變量。您將從變量讀取而不是文件。
首先聲明一個字符變量足夠長,以讀取最長的行。將整行讀入此變量。從變量中讀取第一個字符。如果它是A,請閱讀數字。它看起來像這樣:
character*130 :: MyLine
read(1,'(a130)') MyLine
read(MyLine,*) char
if (char == 'A') then
read(MyLine,*) char, number1, number2, number3
endif
您可以隨時讀取標誌並在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