2017-06-10 29 views
0

に変換私はこのような大規模なテキストファイルを持っている:テキストファイルから文字列を読み取り、整数パラメータ

!species  #Oxygen 
    ind_CO  1.0 
    ind_CO2  2.0 
    ind_CH4  0.0 
    ind_O3  3.0 

を私のコード内の文字(ind_CO、ind_CO2など)は、このように宣言されています:

INTEGER, PARAMETER :: ind_CO2 = 1 
    INTEGER, PARAMETER :: ind_CH4 = 2 
    INTEGER, PARAMETER :: ind_O3 = 3 
    INTEGER, PARAMETER :: ind_CO = 4 

そして、各種の濃度はC(ind_)として計算される。だから私は それぞれのC(ind _)*(#酸素)の積を計算します。つまり、テキストファイルのデータとコードのデータを関連づけたいと思います。私はそれが正しいではないですけど、私の考えは、コードの先頭に各化合物のために保存される名前C行列で挿入することです

program 
    implicit none 
    INTEGER, PARAMETER :: ind_CO2 = 1 
    INTEGER, PARAMETER :: ind_CH4 = 2 
    INTEGER, PARAMETER :: ind_O3 = 3 
    INTEGER, PARAMETER :: ind_CO = 4 

    REAL  :: C(4)  ! Concentration for each Compound 
    REAL  :: numO  ! Number of Oxygens 
    REAL  :: ANS(4)  ! To Calculate 
    INTEGER :: err 
    CHARACTER :: species*11 

    open (unit=15, file="data.txt", status='old',access='sequential', form='formatted', action='read') 
    err=0 
    do 
     read (15, *,IOSTAT=err) species, numO 
     if (err==-1) exit 
    ! I don 't know if it is possible to convert a character to an integer 
    ! parameter in such a way that the index of the matrix corresponds to 
    ! the right compound 
     ANS(species) = C(species)*numO 
     write (*, *) species, numO, ANS(species) 
    enddo 
    close(15) 
    end program 

:私はこのような何かを試してみました。 これらの文字を読んだり変換したり、それらを宣言されたパラメータに関連付けることができるかどうか質問したいと思います。

+0

私はfortran90でそれをしなければなりません – POUR

+0

注意を喚起するために、すべてのFortranの質問にtag [tag:fortran]を使用してください。 –

+0

[tag:fortran77]をなぜ追加しましたか?あなたはFortran 90が必要だと言ったのですか? –

答えて

0

fortranには、シンボル名を文字列にマップする本質的な方法はありません。最も簡単なアプローチは、種の名前を文字配列として保存し、ループを使用して、ファイルから読み込んだ文字列に一致する名前を見つけることです。

implicit none 
    integer :: i 
    integer, parameter :: nspecies=4 
    character(len=11),dimension(nspecies) :: species= & 
     ['ind_CO2','ind_CH4','ind_O3','ind_CO']                 
    character(len=11) :: input                                 
    input='ind_CH4' ! from file                                
    do i = 1,nspecies                                   
    if (input .eq. species(i))exit                              
    enddo                                      
    if (i.gt.nspecies)then 
    write(*,*)'error ',input,' not found' 
    else                         
    write(*,*)'read input is ',i,trim(species(i)) 
    endif                            
    end                                      
+0

"Fortranでは、シンボル名を文字列にマップする本質的な方法はありません。"これは私が探していたものです。 私の質問は少し分かりませんでした。 ご協力いただきありがとうございます。 – POUR

関連する問題