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

标签 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

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

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

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

最佳答案

在这一行

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

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

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

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

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

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

你也可以使用

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

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

最后的办法是使用一些容器的数组,这些容器内部有一个可分配的字符串组件,但请注意 gfortran 至少从 4.8 版开始不支持这些组件。

关于Fortran:将字符数组转换为整数/实数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29282679/

相关文章:

c# - 在 VS2019 中使用 iFort 从 C# 调用 Fortran

java - 什么可能导致 String.charAt(0) 不打印任何内容,并且字符类型为 "16"?

c - C中的数组赋值

c - 只有字符串的第一个字符才会在 C 中打印

loops - 检查变量是否已使用 Fortran 77 声明?

c++ - 从 FORTRAN 代码调用的 C++ 函数调用 C++ 函数

c - 在混合 fortran/C 程序中出现奇怪的崩溃

java - 如何将阿拉伯语单词保存到oracle数据库中?

c - 如何释放在C中作为函数参数传递的字符数组

java - 如何将数字放在 int 的末尾(而不是求和)?