Fortran:将字符数组转换为 integer/real
Fortran: convert character array to integer/real
我想将 Fort运行 中的字符数组转换为数字类型。我想我应该避免使用字符串(也许不是?),因为这些数组存储可变长度数据(用户输入)。
我有以下代码:
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)') MYINT
和 READ(TOKENS(2, 5), '(I2)') MYINT
运行 它分别打印了 1
和 2
。
关于如何让它读取 整个 数组,而不是一次只读取一个字符,有什么想法吗?
在这一行
READ(TOKENS(:, 5), '(I2)') MYINT
您尝试从一个内部文件中读取,该文件是一个字符数组。
但是,Fortran 对每条记录的内部读取使用一个字符串。因此它从数组的第一个元素读取,这是一个长度为 1 的字符串。
您需要在这部分代码中使用字符串,而不是单个字符数组。
例如,如果您可以接受固定的最大字符长度,则可以使用
CHARACTER(LEN=80), ALLOCATABLE :: TOKENS(:)
您也可以使用
CHARACTER(LEN=:), ALLOCATABLE :: TOKENS(:)
根据需要更改字符长度。但是,无论如何,此数组中的所有字符都必须具有相同的长度。
最后的办法是使用一些容器的数组,这些容器内部有一个可分配的字符串组件,但请注意 gfortran 至少从 4.8 版开始不支持这些。
这是将字符串转换为实数(浮点数)和反转的示例。
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
我想将 Fort运行 中的字符数组转换为数字类型。我想我应该避免使用字符串(也许不是?),因为这些数组存储可变长度数据(用户输入)。
我有以下代码:
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)') MYINT
和 READ(TOKENS(2, 5), '(I2)') MYINT
运行 它分别打印了 1
和 2
。
关于如何让它读取 整个 数组,而不是一次只读取一个字符,有什么想法吗?
在这一行
READ(TOKENS(:, 5), '(I2)') MYINT
您尝试从一个内部文件中读取,该文件是一个字符数组。
但是,Fortran 对每条记录的内部读取使用一个字符串。因此它从数组的第一个元素读取,这是一个长度为 1 的字符串。
您需要在这部分代码中使用字符串,而不是单个字符数组。
例如,如果您可以接受固定的最大字符长度,则可以使用
CHARACTER(LEN=80), ALLOCATABLE :: TOKENS(:)
您也可以使用
CHARACTER(LEN=:), ALLOCATABLE :: TOKENS(:)
根据需要更改字符长度。但是,无论如何,此数组中的所有字符都必须具有相同的长度。
最后的办法是使用一些容器的数组,这些容器内部有一个可分配的字符串组件,但请注意 gfortran 至少从 4.8 版开始不支持这些。
这是将字符串转换为实数(浮点数)和反转的示例。
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