Fortran:将字符数组转换为整数/实数。

3
我希望将Fortran中的字符数组转换为数值类型。我认为应该避免使用字符串(或许不是吗?),因为这些数组会存储可变长度数据(用户输入)。
我有以下代码:
IMPLICIT NONE

CHARACTER(LEN=1), ALLOCATABLE :: TOKENS(:, :)
CHARACTER(LEN=1)              :: TEST_STR(80)
INTEGER                       :: I
CHARACTER(LEN=80)             :: INPUT_STR
INTEGER                       :: MYINT

INPUT_STR = '  I am a  test  12  string '
DO I = 1, LEN(INPUT_STR)
   TEST_STR(I) = INPUT_STR(I:I)
END DO

CALL TOKENIZE(TEST_STR, ' ', TOKENS)

PRINT *, "-----------"
INPUT_STR = '15'
PRINT *, INPUT_STR(1:2)
READ(INPUT_STR(1:2), '(I2)') MYINT
PRINT *, MYINT
PRINT *, "-----------"
PRINT *, TOKENS(:, 5)
READ(TOKENS(:, 5), '(I2)') MYINT
PRINT *, MYINT

输出结果如下:
 -----------
 15
          15
 -----------
 12
           1

我已经分别测试了分词器的输出,它的输出是正确的。然而,似乎READ(TOKENS(:, 5), '(I2)') MYINT只能阅读TOKENS(:, 5)的第一个元素。

为了测试,我使用READ(TOKENS(1, 5), '(I2)') MYINTREAD(TOKENS(2, 5), '(I2)') MYINT运行它,分别打印出12

你有什么办法可以让它一次性阅读整个数组,而不仅仅是一个字符吗?

2个回答

2

这是将字符串转换为实数(浮点数)并反转的示例。

p.s. (10)! 不兼容 F77。

Character(10) :: string
Real :: x, y
x = 53.65
write( string, '(f10.2)' )  x ! writes 53.65 into the string
read( string, '(f10.0)' )  y  ! reads the value from string and assigns it to y as real (float)
End

1
在这行中
  READ(TOKENS(:, 5), '(I2)') MYINT

您尝试从内部文件中读取,该文件是字符数组。

但是,Fortran对于每个记录的内部读取使用一个字符字符串。因此,它从您的数组的第一个元素读取,这是一个长度为一的字符字符串。

在代码的这个部分,您需要使用字符串,而不是单个字符的数组。

例如,如果您可以使用固定的最大字符长度,您可以使用

CHARACTER(LEN=80), ALLOCATABLE :: TOKENS(:)

你也可以使用

CHARACTER(LEN=:), ALLOCATABLE :: TOKENS(:)

根据需要更改字符长度。然而,该数组中的所有字符都需要具有相同的长度。

最后的选择是使用一些容器的数组,这些容器内部有可分配的字符串组件,但请注意,至少在版本4.8中,gfortran不支持这些容器。


谢谢Vladimir。与此同时,我已经发现了延迟长度字符串。然而,在我们的团队中,向后兼容性非常重要,这似乎包括支持旧编译器。我已经实施了您以前的方法,因为它用于读取我们的输入文件,该文件不应(我希望!)包含超过80个字符的标记。 - Kyle_S-C
我用类似的东西来达到同样的目的。我只是使用更大的长度以确保安全。 - Vladimir F Героям слава
好的,我应该更仔细地说明。我的意思是读取一个数字,它总是来自单个记录。我希望如此。 - Vladimir F Героям слава

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接