从fortran文件中读取变量

Posted

技术标签:

【中文标题】从fortran文件中读取变量【英文标题】:Reading variables from a file in fortran 【发布时间】:2014-06-26 13:37:44 【问题描述】:

我正在使用一个 fortran 程序,它从文件中读取大量数据并以不同的格式写回。

我用来读取数据的代码是这样的:

10  read(10,*,err=11,end=20) f,time(i),(a(i,j),j=1,14)
    ... 
    goto 10
11  i=i+1
    goto 10

它有效,但仅当输入文件正确时。 但是有些行是这样的:

"2014-04-28 07:51:18.9",2705,-8.42144,6.623851,0.4654102,20.99942,"NAN","NAN",0,0,0,0,-9.0605,5.8855,0.4135,21.39728

发生这种情况时,我会丢失 NAN 之后的行中的所有值。有没有办法读取其他值?

是否可以将每个值读取为字符串,然后将它们转换为双精度值? 我对fortran知之甚少,我需要快速修复它。用 C 重写所有内容可能会花费太多时间。

【问题讨论】:

你能用 C 编写一个快速解析器来清理你的文件,在 Fortran 中处理干净的文件吗?听起来您会知道如何做到这一点,并且不涉及重写所有代码... 这不是一个好主意。数据必须已经通过 3 个程序运行,我不想在该过程中添加另一个步骤。无论如何感谢您的提示。 【参考方案1】:

是的,您可以将整行读入一个字符串。然后解析字符串并将“NAN”替换为一些特殊的数值,例如大的负值。内在函数可以提供帮助,例如,index。然后使用“内部读取”从字符串中读取数值变量。

请参阅:Reading comment lines correctly in an input file using Fortran 90、Reading format in Fortran 90 和 Prevent FORTRAN from closing when a character is inputed instead of a number

【讨论】:

看起来没有一种简单的方法可以做到这一点......我必须将整行读入一个字符串,将其分解为更小的字符串,然后将它们一一转换为浮点数。我不知道如何在 fortran 中做到这一点,我希望它不是很难。谢谢你的帮助,我明天试试。【参考方案2】:

我让它工作了。 代码如下:

  10  read(10,'(a)',err=16,end=20) linha
      linha=trim(adjustl(linha))
      pos1=1
      n2=0
      DO
      pos2 = INDEX(linha(pos1:), ",")

      IF (pos2 == 0) THEN
      n2 = n2 + 1
      strings(n2) = linha(pos1:)
      EXIT
      END IF
      n2 = n2 + 1
      strings(n2) = linha(pos1:pos1+pos2-2)
      pos1 = pos2+pos1
      END DO

      f=strings(1)
      read(strings(2),*) time(i)

      j=1
  11  read(strings(j+2), *,err=12) a(i,j)
      j=j+1
      IF (j > 14) THEN
      goto 13
      END IF
      goto 11

  12  a(i,j)=9999
      j=j+1
      goto 11

  13  IF (a(i,6)==9999) THEN
      goto 14
      END IF
      pp=1000.
      c1=0.622
      c2=1.-c1
      rv=461.5
      e=0.001*a(i,6)*rv*(a(i,4)+273.15)
      a(i,6)=1000*e*c1/(100*pp-c2*e)    
  14  IF (a(i,5)==9999) THEN
      goto 15
      END IF 
      mimol=a(i,5)/44
      a(i,5)=mimol*83.14*(a(i,4)+273.15)/pp
  15  i=i+1
      n=i-1
      if (i.gt.nmax) goto 20
      goto 10

  16  i=i+1
      goto 10

感谢您的帮助。

【讨论】:

以上是关于从fortran文件中读取变量的主要内容,如果未能解决你的问题,请参考以下文章

fortran读取一行数据

从 txt (Fortran) 中错误读取变量

在 Fortran 中逐行读取逗号分隔的文本文件

从 Fortran 中的 HDF 文件中读取长度未知的数组

从 Fortran 到 Linux 的退出代码

将工作代码从双精度转换为四精度:如何从输入文件中读取 FORTRAN 中的四精度数字