使用运行时用户定义的格式将格式化的字符串转换为未格式化的字符串

时间:2019-07-01 14:17:47

标签: fortran

  

问题:如何使用运行时用户定义的FORMAT格式从字符串中读取变量,并将变量的相应二进制版本存储在字符缓冲区中,这些缓冲区的类型源自格式?< / p>      

等效问题:如何将运行时用户定义的FORMAT格式的字符串转换为包含该格式定义的相应类型的相应位表示形式的字符串?

本质上,我们有一个程序可以进行一些简单的处理。步骤是:

  1. 从文件中读取字符串
  2. 从文件中读取用户定义的格式
  3. 以格式处理字符串并将所有变量存储在字符缓冲区(二进制形式)
  4. 继续计划

一个简化的程序是:

program test
  implicit none
  character(len=16) :: string
  character(len=32) :: fmt
  character(len=8) :: buf1, buf2, buf3

  string = 'ABC 12  3.4'
  fmt = '(A3,1X,I2,1X,F4.1)'

  read(string,fmt) buf1,buf2,buf3
  write(*,'(A3,A4,A8)') buf1,buf2,buf3
end program

od解析的示例输出可能是:

$ ./a.out | od -t x1
0000000 41 42 43 0c 00 00 00 33 33 33 33 33 33 0b 40 0a
0000020

此输出显然取决于系统。在这种情况下,浮点数假定为IEEE浮点数,并且系统以低字节序运行。 序列41 42 43代表ABC,序列0c 00 00 00代表12,而33 33 33 33 33 33 0b 40 0a是数字3.4中最接近的双精度表示。

上述程序使用SolarisStudio Fortran编译器f90并使用标志-f77=input可以编译并正常运行。

$ f90 -f77=input file.f90

但是,很明显,这不是标准的Fortran。读取格式和变量应匹配类型。 GNU编译器很快对此感到窒息:

$ gfortran file.f90
$ ./a.out 
At line 10 of file read_string.f90
Fortran runtime error: Expected INTEGER for item 2 in formatted transfer, got CHARACTER
(A3,1X,I2,1X,F4.1)

是否有“简单”的方法可以在Standard Fortran中进行转换或使其在其他编译器(例如GNU / Intel / PGI Fortran编译器)中工作?

0 个答案:

没有答案