从文本文件中读取字符数组并将其转换为整数参数
Reading characters array from a text file and convert it to an integer parameter
我有一个像这样的大文本文件:
!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_)*(#Oxygen) 的乘积。也就是说,我想将文本文件的数据与代码的数据相关联。我试过这样的事情:
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
我知道这不正确,但我的想法是在矩阵 C 中插入在代码开头为每个化合物保存的名称。
所以想问问大家是否可以读取或转换这些字符,并将它们与声明的参数关联起来。
在 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
我有一个像这样的大文本文件:
!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_)*(#Oxygen) 的乘积。也就是说,我想将文本文件的数据与代码的数据相关联。我试过这样的事情:
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
我知道这不正确,但我的想法是在矩阵 C 中插入在代码开头为每个化合物保存的名称。 所以想问问大家是否可以读取或转换这些字符,并将它们与声明的参数关联起来。
在 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