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

时间:2015-03-26 15:36:19

标签: fortran character character-arrays

我想将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

我已经单独测试过,tokenizer提供了合理的输出,它确实如此。但是,READ(TOKENS(:, 5), '(I2)') MYINT似乎只是在阅读TOKENS(:, 5)的第一个元素。

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

关于如何让它读取整个数组的任何想法,而不是一次只读一个字符?

2 个答案:

答案 0 :(得分:1)

在这一行

  READ(TOKENS(:, 5), '(I2)') MYINT

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

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

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

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

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

您也可以使用

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

根据需要更改字符长度。但是,此数组中的所有字符无论如何都需要具有相同的长度。

最后一种方法是使用一些容器的数组,这些容器里面有一个可分配的字符串组件,但要注意gfortran至少不支持4.8版本。

答案 1 :(得分:1)

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

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