问题:如何使用运行时用户定义的FORMAT格式从字符串中读取变量,并将变量的相应二进制版本存储在字符缓冲区中,这些缓冲区的类型源自格式?< / p>
等效问题:如何将运行时用户定义的FORMAT格式的字符串转换为包含该格式定义的相应类型的相应位表示形式的字符串?
本质上,我们有一个程序可以进行一些简单的处理。步骤是:
一个简化的程序是:
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编译器)中工作?