【问题标题】:How to read numeric data from a string in FORTRAN如何从 FORTRAN 中的字符串中读取数字数据
【发布时间】:2014-09-05 20:27:59
【问题描述】:

我在 FORTRAN 中有一个字符串数组作为“结果:CI-Energies --- th= 89 ph=120”。如何从字符串中提取字符“120”并存储到实变量中?

字符串写入文件'input.DAT'。我将 FORTRAN 代码编写为:

implicit real*8(a-h,o-z)
character(39)  line
open(1,file='input.DAT',status='old')
read(1,'(A)') line,phi
write(*,'(A)') line
write(*,*)phi
end

执行时显示:

At line 5 of file string.f (unit = 1, file = 'input.dat')
Fortran runtime error: End of file

我给出了 '39' 作为字符数组的维度,因为字符串中有 39 个字符,包括 '空格' 直到 '120'。

【问题讨论】:

  • 这段代码有几个问题。要修复此特定错误,请将 read(1,'(A)') line,phi 替换为两行:read(1,'(A)') lineread(line(37:),'(F3.0)') phi
  • 您的问题表明您对 Fortran 编程比较陌生。不要学用隐式类型,学会用implicit none

标签: string io fortran gfortran


【解决方案1】:

将字符串s转换为实型变量r

READ(s, "(Fw.d)") r

这里w 是总字段宽度,d 是小数点后的位数。如果输入字符串中没有小数点,wd 的值可能会影响结果,例如

s = '120'
READ(s, "(F3.0)") r ! r <-- 120.0
READ(s, "(F3.1)") r ! r <--  12.0

问题的另一部分的答案(如何提取具有特定数字的子字符串进行转换)很大程度上取决于输入字符串的格式,例如如果所有字符串都由固定宽度的字段组成,则可以跳过字符串的不相关部分:

s = 'a=120'
READ(s(3:), "(F3.0)") r

【讨论】:

    【解决方案2】:

    假设要读取的实数出现在字符串中最后一个等号之后,可以使用 SCAN 内部函数找到该位置,然后从字符串的其余部分读取数字,如下所示程序。

    program xreadnum
    implicit none
    integer :: ipos
    integer, parameter :: nlen = 100
    character (len=nlen) :: str
    real :: xx
    str  = "results: CI- Energies --- th= 89 ph=120"
    ipos = scan(str,"=",back=.true.)
    print*,"reading real variable from '" // trim(str(1+ipos:)) // "'"
    read (str(1+ipos:),*) xx
    print*,"xx = ",xx
    end program xreadnum
    ! gfortran output:
    ! reading real variable from '120'
    ! xx =    120.000000    
    

    【讨论】:

      猜你喜欢
      • 2013-09-18
      • 1970-01-01
      • 1970-01-01
      • 2017-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多