Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Fortran 从文本文件读取字符数组并将其转换为整数参数_Fortran_Type Conversion_Fortran90 - Fatal编程技术网

Fortran 从文本文件读取字符数组并将其转换为整数参数

Fortran 从文本文件读取字符数组并将其转换为整数参数,fortran,type-conversion,fortran90,Fortran,Type Conversion,Fortran90,我有一个像这样的大文本文件: !species #Oxygen ind_CO 1.0 ind_CO2 2.0 ind_CH4 0.0 ind_O3 3.0 INTEGER, PARAMETER :: ind_CO2 = 1 INTEGER, PARAMETER :: ind_CH4 = 2 INTEGER, PARAMETER :: ind_O3 = 3 INTEGER, PARAMETER :: ind_CO

我有一个像这样的大文本文件:

!species     #Oxygen
  ind_CO      1.0
  ind_CO2     2.0
  ind_CH4     0.0
  ind_O3      3.0
  INTEGER, PARAMETER :: ind_CO2 = 1 
  INTEGER, PARAMETER :: ind_CH4 = 2
  INTEGER, PARAMETER :: ind_O3  = 3
  INTEGER, PARAMETER :: ind_CO  = 4
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
但在我的代码中,字符(ind_CO、ind_CO2等)的声明如下:

!species     #Oxygen
  ind_CO      1.0
  ind_CO2     2.0
  ind_CH4     0.0
  ind_O3      3.0
  INTEGER, PARAMETER :: ind_CO2 = 1 
  INTEGER, PARAMETER :: ind_CH4 = 2
  INTEGER, PARAMETER :: ind_O3  = 3
  INTEGER, PARAMETER :: ind_CO  = 4
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(ind_)。所以我想要 计算每一个的C(ind)*(#氧)乘积。也就是说,我想把文本文件的数据和代码的数据联系起来。我试过这样的方法:

!species     #Oxygen
  ind_CO      1.0
  ind_CO2     2.0
  ind_CH4     0.0
  ind_O3      3.0
  INTEGER, PARAMETER :: ind_CO2 = 1 
  INTEGER, PARAMETER :: ind_CH4 = 2
  INTEGER, PARAMETER :: ind_O3  = 3
  INTEGER, PARAMETER :: ind_CO  = 4
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                                                                                                                                                       

我必须在Fortran 90上使用所有Fortran问题的标记来获得更多关注。为什么要添加?你说你需要Fortran 90,是吗?阅读Fortran的名字列表,它可能对你有用。是的,我必须在f90上做。但是,我希望,以前版本中的任何想法都会有用。我将检查名称列表,谢谢“在fortran中,没有将符号名称映射到字符串的内在方法。”这就是我所寻找的。我的问题有点难以理解。非常感谢您的工作和时间。