2010-04-27 49 views
0

在Fortran中,這將是切實可行的方法爲:讀一本線,其內容取決於第一個字符

A 1. 2. 3. 

如果第一個字符是一個「A」,但沒有看過:

Z 

如果第一個字符是「Z」,例如休息。

如果我試圖在整個讀取行:

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

那麼如果數字是缺少會出現錯誤。因此,我需要一種方法來讀取該行上的「A」,並根據「A」或「Z」讀取,如果需要,請閱讀其餘部分。

回答

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值。

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

您可以隨時讀取標誌並在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 
相關問題